C++中异常对象的范围

Nav*_*een 39 c++ scope exception-handling

C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?

CB *_*ley 38

throw表达式求值,异常对象从表达式的值初始化.抛出的异常对象从throw表达式的静态类型中获取其类型,忽略any constvolatile限定符.对于类类型,这意味着执行复制初始化.

异常对象的作用域超出了发生抛出的块的作用域.可以把它想象成生活在普通调用堆栈一侧的特殊异常区域,本地对象就在这里.

catch块内部,使用此异常对象初始化使用捕获的异常对象初始化的名称,而不是参数throw,即使这是一个左值.

如果你catch通过非const引用,那么你可以改变异常对象,但不能改变它的初始化.如果您以值或const引用(const_casts旁)捕获的方式重新抛出异常,则可以更改程序的行为.

当最后一个未通过重新抛出(即无参数抛出表达式评估)退出的catch块完成时,将销毁异常对象.


aJ.*_*aJ. 9

异常对象仅在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方法.