Mar*_*som 20 c++ exception-handling exception
标准是否有关于引用捕获的异常以及尝试修改它的情况有什么说法?
请考虑以下代码:
class my_exception: public std::logic_error
{
public:
std::vector<std::string> callstack;
};
void MyFunc()
{
try
{
SomethingThatThrows();
}
catch (my_exception & e)
{
e.callstack.push_back("MyFunc");
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个人为的例子,我实际上并没有尝试这样的事情.我只是好奇会发生什么,基于另一个线程中的建议,异常应该被const引用捕获.
ken*_*ytm 20
例外情况将会改变.
§15.3[except.handle]/17:
当处理程序声明一个非常量对象时,对该对象的任何更改都不会影响通过执行throw-expression初始化的临时对象.
当处理程序声明对非常量对象的引用时,对引用对象的任何更改都是对执行throw-expression时初始化的临时对象的更改,并且如果该对象被重新抛出则会生效.
因此,如果my_exception被捕获MyFunc,我们将看到"MyFunc"callstack中的条目(例如http://ideone.com/5ytqN)
Jam*_*lis 10
是的,你可以这样做.
使用时重新抛出当前异常时throw;,不会进行任何复制:重新抛出原始临时异常对象.因此,当您下次捕获它时,您在处理程序中对该对象所做的任何更改都将出现在异常对象中.