更有效的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
}
}
我怀疑它是如何通过引用捕获异常的?如果它是局部变量(非静态或全局),则一旦控制离开函数,对象就不存在。那么如何通过引用来捕获异常来解决问题?
答案 0 :(得分:4)
要捕获指针,必须抛出指针。要捕获引用,请按值抛出对象。给定对象名称的throw表达式创建对象的副本;它没有将其论证解释为参考。
抛出的副本称为异常对象,它位于由运行时库维护的特殊分配区域中。它的析构函数在异常传播完成时被调用,这可能是调用堆栈的任何位置。 C ++ 11提供了使用引用计数语义手动控制异常对象生存期的其他工具。
如果按值捕获,则在输入按值捕获的catch
块时生成另一个副本,并且在离开该catch
块时销毁该第二个副本,即使该异常传播到另一个封闭catch
块。外部catch
将看到原始异常对象,而内部catch
未应用任何修改。
让catch
阻止沟通的能力是通过非const
引用的习惯来实现的。
顺便说一句,throw by pointer从根本上被打破,因为它无法处理内存不足错误。如果您尝试使用new
分配异常对象但没有更多内存,std::bad_alloc
将在程序到达throw
表达式之前劫持该程序。该库提供了另一种分配异常的方法,以提供内存不足的情况。