在修改后的异常上使用`throw;`

P45*_*ent 57 c++ exception-handling exception throw language-lawyer

我有一个foo可以抛出bar异常的函数.

在我调用的另一个函数中,foo但是bar如果抛出,我可以向异常添加更多细节.(foo由于该函数的通用特性,我宁愿不将这些信息作为参数传递给它,因为它并不真正属于那里.)

所以我在调用者中这样做:

try {
    foo();
} catch (bar& ex){
    ex.addSomeMoreInformation(...);
    throw;
}
Run Code Online (Sandbox Code Playgroud)

throw重新抛出修改过的异常还是我需要使用throw ex;?后者可能会采用有价值的副本,所以我宁愿不这样做.还会throw带一个价值副本吗?我怀疑它不会.

(我知道我可以验证,但我担心绊倒一个未指定或未定义的构造,所以想知道肯定).

Col*_*mbo 59

实际上,这里的标准非常精确.[except.handle]/17:

当处理程序声明对非常量对象的引用时,对引用对象的任何更改都是对执行throw-expression时初始化的临时对象的更改,并且如果该对象被重新抛出则会生效.

并且[except.throw]/8:

一个界外球的表达,没有操作重新抛出当前处理的例外(15.3).


Che*_*Alf 26

C++11§15.1/ 8:

"掷表达与没有操作数重新抛出当前处理的异常(15.3).使用现有临时值重新激活该例外; 没有创建新的临时异常对象.

  • 请在非标准中添加一系列解释.这样我甚至不理解答案.修改是否生效? (16认同)
  • @marczellm"没有创建新的临时异常对象" (3认同)