【发布时间】:2016-07-20 10:58:07
【问题描述】:
我正在导出我自己的异常,将其命名为 MyException,来自 std::system_error 并覆盖 what() 以计算并返回我的消息。 MyException 的初始值设定项列表不会调用 system_error 构造函数覆盖接收消息。
如果我捕获 MyException 并将其复制到 std::exception,则在 std::exception 上调用 what() 的结果是 nullptr。这是有道理的。
我的问题是,如果我在初始化MyException 时确实使用了接收消息的system_exception 的构造函数,是否指定system_error 将获取消息的副本并拥有它并释放它?
我假设这将使MyException 的std::exception 副本能够返回有效的what()。虽然我会因为每次创建 MyExceptions 的新值时需要计算的“什么”而受到性能影响;我不能只在第一次调用 what() 时才懒惰地计算它。
我有点担心“what”字符串的所有权,因为what() 返回的是char*,而不是const std::string&。
代码是这样的(我没有编译过):
class MyException : public std::system_error
{
std::string what_;
public:
MyException(int errorValue, const std::error_category& category)
: std::system_error(errorValue, category)
{}
char* what() const
{
what_ = "MyException: " + to_string(code().value());
return what_.c_str();
}
};
int main()
{
std::exception ex;
try
{
throw MyException(4, system_category());
}
catch( const MyException& e )
{
ex = e;
}
printf("what= %s", ex.what());
return 1;
}
【问题讨论】:
-
请出示您的代码。并且“如果我捕获了 MyException 并将其复制到 std::exception ” - 你已经分割了你的异常对象。
what结果在被调用之前可能不存在。 -
@RichardCritten 添加了代码。我理解切片。
-
然而,
std::runtime_error拥有它的字符串。具体来说,一个不可变的引用计数字符串,而不是std::string。 -
@ildjarn 这看起来像是一个答案。我猜可能是这种情况,但通过谷歌搜索找不到。如果它在 Visual Studio 中有效,则不想假设这就是标准的定义方式。
标签: c++ exception c++14 std std-system-error