【发布时间】:2011-09-06 11:06:55
【问题描述】:
建议你总是抛出一些源自std::exception 的东西,并且有一些预定义的特化,例如std::runtime_error
std::exception 的接口以非抛出访问器的形式给出。伟大的。现在看std::runtime_error的构造函数
class runtime_error : public exception {
public:
explicit runtime_error (const string &);
};
所以如果我这样做这个
try {
foo ();
}
catch (...) {
throw std :: runtime_error ("bang");
}
foo 完全有可能因为内存不足而抛出,在这种情况下,构造 runtime_error 的 string 参数也可以抛出。这将是一个本身也会抛出的 throw 表达式:这不会调用 std::terminate 吗?
这是否意味着我们应该始终这样做:
namespace {
const std :: string BANG ("bang");
}
...
try {
foo ();
}
catch (...) {
throw std :: runtime_error (BANG);
}
但是等等,这也行不通,是吗?因为runtime_error 会复制它的参数,这也可能抛出......
...所以这是否意味着没有安全的方法来使用 std::exception 的标准特化,并且您应该始终滚动自己的字符串类,其构造函数只会失败而不抛出?
或者我缺少什么技巧?
【问题讨论】:
-
使用具有小字符串优化(无分配)和非常短的错误消息的标准库实现?
标签: c++ exception exception-handling constructor std