【发布时间】:2016-01-28 00:28:07
【问题描述】:
请看下面的异常抛出和捕获:
void some_function() {
// Was std::exception("message") in original post, which won't compile
throw std::runtime_error("some error message");
}
int main(int argc, char **argv) {
try {
some_function();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
exit(1);
}
return 0;
}
通过引用捕获抛出的异常是否安全?
我担心的是因为异常 e 实际上放在了some_function() 的堆栈上。但是some_function() 刚刚返回,导致e 被破坏。所以实际上现在e 指向一个被破坏的对象。
我的担心正确吗?
在不按值复制的情况下传递异常的正确方法是什么?我应该把new std::exception() 扔到动态内存中吗?
【问题讨论】:
-
请注意,std::exception 的字符串构造函数不是标准的,这是一个 MS(符合?)扩展。 stackoverflow.com/questions/5157206/…
-
那么如何将消息分配给异常,以便使用
what()打印? -
@SomethingSomething 您将使用
std::exception的派生类,它允许将消息传递给构造函数。例如std::runtime_error。抛出子类型的约定正是你应该通过 (const) 引用捕获的原因。 -
要编写可移植的代码,您必须从
std::exception继承并编写自己的what()方法,即std::exception中的虚拟方法 -
@SomethingSomething 两种方式:1. 使用提供构造函数和字符串消息状态的
std::runtime_error或std::logic_error或2. 自己做。查看此问题的答案:stackoverflow.com/questions/8152720/…。