C++ try/catch异常

42fyovps  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(138)
try {
    char message = "Error!";
    throw message;
}

捕鱼地点。

catch (char* &e) {
court << e << endl;
    return 0;
}

有人知道怎么修吗?
我想显示错误消息,但必须使用C字符串。

mzmfm0qo

mzmfm0qo1#

你没有抛出字符串或数组,因为数组到指针的衰减,你抛出了一个指向message数组第一个元素的指针,你很好地捕捉到了这个指针。不幸的是,在堆栈展开期间,指针指向的数组被销毁,因为它是if块中的局部变量,而您的catch块在if之外因此,您试图取消引用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()成员函数检索它。
您甚至可以直接使用它们,而无需继承自己的异常类:

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;
}

相关问题