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).使用现有临时值重新激活该例外; 没有创建新的临时异常对象.
| 归档时间: |
|
| 查看次数: |
2765 次 |
| 最近记录: |