try { char message = "Error!"; throw message; }
捕鱼地点。
catch (char* &e) { court << e << endl; return 0; }
有人知道怎么修吗?我想显示错误消息,但必须使用C字符串。
mzmfm0qo1#
你没有抛出字符串或数组,因为数组到指针的衰减,你抛出了一个指向message数组第一个元素的指针,你很好地捕捉到了这个指针。不幸的是,在堆栈展开期间,指针指向的数组被销毁,因为它是if块中的局部变量,而您的catch块在if之外因此,您试图取消引用cout << *e << endl;中的悬空指针,从而导致未定义的行为。理论上你可以
message
if
catch
cout << *e << endl;
const char* message = "Error! Invalid data for: Total Crew."; throw message;
或
throw "Error! Invalid data for: Total Crew.";
抛出一个指向字符串常量的指针,字符串常量会一直存在到程序结束,但这确实是一个糟糕的做法。你应该编写一个继承自std::exception或其他标准库异常类(如std::invalid_argument)的类,然后抛出一个异常类的示例。这样你就可以让catch子句处理特定类型的异常,而不仅仅是普通的char*,它可能意味着任何东西。另外,cout << *e << endl;只打印字符串的第一个字符,即使没有生存期问题,您可能指的是cout << e << endl;。但我必须用C字裤。除了所有的字符串常量都是C风格的字符串之外,没有什么好理由这样做。继承自std::exception的异常类允许提供一个字符串参数,通过构造函数存储在异常对象中,并通过catch处理程序中的.what()成员函数检索它。您甚至可以直接使用它们,而无需继承自己的异常类:
std::exception
std::invalid_argument
char*
cout << e << endl;
.what()
if (totalCrew <=0) { throw std::invalid_argument("Error! Invalid data for: Total Crew."); } //... catch (const std::invalid_argument& e) { cout << e.what() << endl; cout << "Line: " << line << endl; return 0; }
1条答案
按热度按时间mzmfm0qo1#
你没有抛出字符串或数组,因为数组到指针的衰减,你抛出了一个指向
message
数组第一个元素的指针,你很好地捕捉到了这个指针。不幸的是,在堆栈展开期间,指针指向的数组被销毁,因为它是if
块中的局部变量,而您的catch
块在if
之外因此,您试图取消引用cout << *e << endl;
中的悬空指针,从而导致未定义的行为。理论上你可以
或
抛出一个指向字符串常量的指针,字符串常量会一直存在到程序结束,但这确实是一个糟糕的做法。你应该编写一个继承自
std::exception
或其他标准库异常类(如std::invalid_argument
)的类,然后抛出一个异常类的示例。这样你就可以让catch
子句处理特定类型的异常,而不仅仅是普通的char*
,它可能意味着任何东西。另外,
cout << *e << endl;
只打印字符串的第一个字符,即使没有生存期问题,您可能指的是cout << e << endl;
。但我必须用C字裤。
除了所有的字符串常量都是C风格的字符串之外,没有什么好理由这样做。继承自
std::exception
的异常类允许提供一个字符串参数,通过构造函数存储在异常对象中,并通过catch
处理程序中的.what()
成员函数检索它。您甚至可以直接使用它们,而无需继承自己的异常类: