如果被外层调用者捕获,C ++异常是否超出范围?

时间:2013-01-25 14:36:22

标签: c++ exception

我尝试在我的代码中找到正确的方法来实现异常时进行了一些研究

    Throw by value, catch by reference

是C ++中交易异常的推荐方式。关于抛出的异常何时超出范围我感到很困惑。

我有以下异常层次结构

    ConnectionEx is mother of all connection exceptions thrown by dataSender
    ConnectionLostEx is one of the subclasses of ConnectionEx

所以这是一个示例代码。单词DataSender实例是DataDistrubutor的成员,它调用dataSender上的函数,例如send(),并且DataSender在出现问题时将ConnectionEx的子类作为异常抛出。

// dataSender send() function code chunk

try
{
   // some problem occured
       // create exception on stack and throw
   ConnectionLostEx ex("Connection lost low signals", 102);
   throw ex;
}
catch(ConnectionLostEx& e)
{
    //release resources and propogate it up
    throw ;
}

//A data distributor class that calls dataSender functions
try
{
    // connect and send data
    dataSender.send();  
}
catch(ConnectionEx& ex)
{
       // free resources
       // Is the exception not out of scope here because it was created on stack of orginal block?
       //propogate it further up to shows cause etc..

}

在C#或java中我们有一个类似引用的指针,并且它一直有效,我对异常的范围感到困惑,因为异常是在值超出范围时被值抛出的???并且当作为父类型被捕获时,在这种情况下,可以将其转换为在catch块链中将真实的一个返回到哪里?

1 个答案:

答案 0 :(得分:3)

抛出异常的副本,而不是原始对象。没有必要实例化局部变量并抛出它;抛出异常的惯用方法是实例化它并将其抛出到同一行。

throw ConnectionLostEx("Connection lost low signals", 102);