【问题标题】:Exception class - what() function异常类 - what() 函数
【发布时间】:2018-06-16 02:02:00
【问题描述】:

我目前正在开发我自己的继承自 std::exception 的异常类,我不确定是否应该创建自己的 what() 或只是调用 std::exception("message") 在我的类构造函数中。 这是我当前的代码:

FilterException::FilterException(const char* message, int num) noexcept :
    error_message(message), error_number(num) {}

const char* FilterException::what() const noexcept
{
    return error_message.c_str();
}

FilterException::~FilterException() noexcept
{
}

int FilterException::getErrorNumber() const noexcept
{
    return error_number;
}

所以,我的问题是,我应该就这样离开它,还是在构造函数中进行更改并摆脱 what()

【问题讨论】:

标签: c++ exception error-handling


【解决方案1】:

首先,std::exception("message") 构造函数是 VC++ 的一个实现细节。它在大多数其他实现中不存在。

std::string 中存储what-message 一开始似乎很方便,但它为内存不足的情况增加了一个极端情况:复制字符串可能 会导致bad_alloc 异常。在尝试处理第一个异常时发生新异常并不是那么好。

直接从std::exception 派生的一种选择是从<stdexcept> 中的预定义异常之一派生,例如std::runtime_error。这些异常确实具有采用字符串参数的构造函数,并且已经以某种方式解决了双重异常问题。可能通过存储std::string

【讨论】:

  • except.throw/7 可以作为重新投掷不好的证据。
  • @xskxzr - 是的,我不想详细说明它到底有多糟糕。或者,如果在构造异常对象或实际抛出异常对象时发生bad_alloc,它可能会有所不同。我会尽量避免这种情况!
猜你喜欢
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
相关资源
最近更新 更多