可能重复:
函数的try-catch语法之间的差异
几天前,我读了一本关于C++的书(它甚至可能是Bjarne Stroustrup的书),我在关于异常的章节中发现了这样的方法:
class Foo :
public Bar
{
// ...
};
// ...
Foo::Foo
try :
Bar ()
{
// ...
}
catch (const std::exception& error)
{
// ...
}
我不知道为什么,但这个构造对我来说很奇怪。不过它非常强大,因为它让我能够处理基类"内部"顶级构造函数抛出的异常。
我使用C++几年了,我想,我对这种语言很了解。。。这种方法有什么问题?为什么C++书中没有经常提到它?
真正的原因是在catch块中几乎没有什么可做的。你可以做一些类似登录的事情,或者抛出一个不同的异常,但如果你到达catch块的末尾而没有抛出,那么原始异常将自动重新抛出。
赫伯·萨特在这篇文章中很好地解释了这一切。
类构造函数很少能从其依赖项引发的异常中恢复。这就是为什么你不经常看到这种形式。另外,正如你所说,这看起来有点奇怪。
您可以捕获异常,但这对您没有多大帮助,因为您的对象还没有构造好。
您不能使用对象,也不能使用其成员。它违反了RAII。
您唯一能做的就是重新抛出异常,可能需要一些额外的信息来澄清情况。