什么是C ++异常对象的范围? 它一旦被执行catch处理出去的范围是什么? 另外,如果我创建一个未命名的异常对象,并把它扔,然后同时捕获该异常,如果我通过引用或一个非const引用赶上它什么关系呢?
Answer 1:
当throw
表达式,一个异常对象从表达式的值初始化。 其引发的异常对象获得由静态型抛表达忽略任何的它的类型const
和volatile
限定符。 对于类类型,这意味着复制进行初始化 。
异常对象的范围,其中发生掷块的范围之外。 把它看成是生活在一个特殊的例外区域关闭到本地对象生活的正常调用堆栈的一侧。
内catch
块,与捕获的异常对象初始化的名称被初始化此异常对象,而不是争论throw
,即使这是一个左值。
如果catch
通过非const引用,那么你可以变异的异常对象,但是不知道它是从初始化。 你可以改变程序的行为,如果你再扔在你不能,如果你通过值或const引用捕捉方式除外( const_cast
š除外)。
最后一个catch块通过重新掷不退出(即无参数的throw表达式评估)完成时,异常对象被销毁。
Answer 2:
唯一的例外对象只可catch
块。 您不能使用异常对象外catch
块。 下面的步骤,当你抛出一个异常,并捕获发生:
try
{
MyException anObject;
throw anObject; //1
}
catch(MyException exObject)
{
}
- 该
throw
条款(// 1)接收本地对象anObject
,并将它作为一个值的参数:它创建的副本anObject
。 - 所述
catch
处理程序捕获了一个MyException对象,这又是一个值参数。 这时创建另一个副本。 - 如果
catch
处理程序将已经实现,以接收到的对象的引用(catch (MyException &o))
避免了第二个副本。 - 如果
catch
处理器通过接收异常对象const&
那么你只能调用const
方法。
Answer 3:
首先,你扔对象超出范围几乎立即。 这是怎么回事的异常处理程序被抓是原始对象的副本 。 之后,除非你抓住它的值(不是引用)被执行catch处理该副本将被删除。 在这种情况下,就会有另一个副本创建。 但是你应该参考(最好是常量之一)反正抓住它。
文章来源: Scope of exception object in C++