不显示C ++自定义异常消息

时间:2017-07-08 20:21:58

标签: c++ c++11 exception-handling

我正在尝试创建一个自定义异常类,抛出它并显示错误消息,但是我做错了什么,导致异常不被抛出并且消息无法打印。

这是异常类:

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

控制台中没有与此错误相关的内容。

提前致谢。

2 个答案:

答案 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()的结果是假的。

使用调试器逐步完成程序。