将异常对象引用传递给新的异常对象是否安全?

时间:2011-12-26 23:49:50

标签: c++ exception-handling

假设以下内容:

struct wrapper_exception {
std::runtime_error& err;
  wrapper_exception( std::runtime_error& _e ) : err(e) {}
}; 

try {

throw std::runtime_error("foo");

} catch (std::runtime_error& err) {

 throw wrapper_exception( err);
}

问题:处理后,在wrapper_exception中访问对runtime_error的引用是否安全?

1 个答案:

答案 0 :(得分:6)

我很想说这是未定义的行为。

标准反复说,当活动处理程序退出而不是通过重新抛出异常时,异常对象的生命周期结束,即通过说throw;

由于您不重新抛出异常,原始异常对象在catch块的末尾到期,您最终会得到一个悬空引用,与抛出一个包含对局部变量的引用的对象没什么不同。