Nav*_*een 39 c++ scope exception-handling
C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?
CB *_*ley 38
当throw表达式求值,异常对象从表达式的值初始化.抛出的异常对象从throw表达式的静态类型中获取其类型,忽略any const和volatile限定符.对于类类型,这意味着执行复制初始化.
异常对象的作用域超出了发生抛出的块的作用域.可以把它想象成生活在普通调用堆栈一侧的特殊异常区域,本地对象就在这里.
在catch块内部,使用此异常对象初始化使用捕获的异常对象初始化的名称,而不是参数throw,即使这是一个左值.
如果你catch通过非const引用,那么你可以改变异常对象,但不能改变它的初始化.如果您以值或const引用(const_casts旁)捕获的方式重新抛出异常,则可以更改程序的行为.
当最后一个未通过重新抛出(即无参数抛出表达式评估)退出的catch块完成时,将销毁异常对象.
异常对象仅在catch块中可用.您不能在catch块外使用异常对象.抛出异常并捕获以下步骤:
try
{
MyException anObject;
throw anObject; //1
}
catch(MyException exObject)
{
}
Run Code Online (Sandbox Code Playgroud)
throw条款(// 1)接收本地对象anObject,并且将其视为一个值的参数:它创建的副本anObject.catch处理程序捕获了一个MyException对象,这又是一个值参数.此时创建另一个副本.catch处理程序已经实现以便接收对对象的引用(catch (MyException &o)),则避免第二个副本.catch处理程序接收到异常对象,const&则只能调用const方法.