如何通过引用捕获异常来解决局部变量问题

时间:2013-12-12 07:28:25

标签: c++ exception-handling

更有效的c ++项目编号-13,项目13:通过引用捕获异常。

点也说 - 要通过指向工作来捕获异常,程序员必须以控制离开函数后保证对象存在的方式定义异常对象。全局和静态对象工作正常。

//通过指针捕获异常的示例

class exception { ... };          // from the standard C++

void someFunction()
{
    static exception ex;            // exception object
    ...
    throw &ex;                      // throw a pointer to ex
    ...
}
void doSomething()
{
    try 
    {
        someFunction();               // may throw an exception*
    }

    catch (exception *ex) 
    {    // catches the exception*;
        ...                           // no object is copied
    }
}

我怀疑它是如何通过引用捕获异常的?如果它是局部变量(非静态或全局),则一旦控制离开函数,对象就不存在。那么如何通过引用来捕获异常来解决问题?

1 个答案:

答案 0 :(得分:4)

要捕获指针,必须抛出指针。要捕获引用,请按值抛出对象。给定对象名称的throw表达式创建对象的副本;它没有将其论证解释为参考。

抛出的副本称为异常对象,它位于由运行时库维护的特殊分配区域中。它的析构函数在异常传播完成时被调用,这可能是调用堆栈的任何位置。 C ++ 11提供了使用引用计数语义手动控制异常对象生存期的其他工具。

如果按值捕获,则在输入按值捕获的catch块时生成另一个副本,并且在离开该catch块时销毁该第二个副本,即使该异常传播到另一个封闭catch块。外部catch将看到原始异常对象,而内部catch未应用任何修改。

catch阻止沟通的能力是通过const 引用的习惯来实现的。


顺便说一句,throw by pointer从根本上被打破,因为它无法处理内存不足错误。如果您尝试使用new分配异常对象但没有更多内存,std::bad_alloc将在程序到达throw表达式之前劫持该程序。该库提供了另一种分配异常的方法,以提供内存不足的情况。