我正在尝试创建一个自定义异常类,抛出它并显示错误消息,但是我做错了什么,导致异常不被抛出并且消息无法打印。
这是异常类:
class UnbalancedParenthesesException : public std::exception {
int line_number {0};
public:
UnbalancedParenthesesException(int line_number) :
line_number { line_number }
{}
virtual const char* what() const throw() {
std::string exception_message =
"Papentheses imbalance at line " + std::to_string(line_number) + "\n";
return exception_message.c_str();
}
};
我正在尝试try
/ throw
/ catch
,如下所示:
void handle_closed_paren(int line_number) {
try {
if (definitely_unbalanced()) {
throw UnbalancedParenthesesException(line_number);
}
} catch (const UnbalancedParenthesesException& e) {
std::out << e.what() << "\n";
}
控制台中没有与此错误相关的内容。
提前致谢。
答案 0 :(得分:2)
您的what()
方法正在创建一个本地std::string
变量,然后返回一个指向其内部数据的指针,当std::string
超出范围并且在销毁时会被销毁。 what()
退出。
您需要将错误消息存储在作为类成员的std::string
中,以便它不会过早地超出范围。幸运的是,std::exception
已经有了内部std::string
用于此目的。因此,不应在what()
本身格式化错误消息,而应在派生构造函数中对其进行格式化并将其传递给基类构造函数,让基本what()
方法按原样返回:
class UnbalancedParenthesesException : public std::exception
{
int mLineNumber;
public:
UnbalancedParenthesesException(int line_number) : std::exception("Parentheses imbalance at line " + std::to_string(line_number)), mLineNumber(line_number) {}
// optional, if the catcher needs access to the value
int lineNumber() const { return mLineNumber; }
};
答案 1 :(得分:1)
当您在超出范围的c_str()
上返回std::string
的结果时,您的程序具有未定义的行为。任何事情都可能发生。
除此之外,如果您没有看到异常,那么就不会抛出异常,可能是因为definitely_unbalanced()
的结果是假的。
使用调试器逐步完成程序。