尝试/捕获类构造函数C++"中间"

try/catch "in the middle" of C++ class constructor

本文关键字:C++ 中间 构造函数 尝试      更新时间:2023-10-16

可能重复:
函数的try-catch语法之间的差异

几天前,我读了一本关于C++的书(它甚至可能是Bjarne Stroustrup的书),我在关于异常的章节中发现了这样的方法:

class Foo :
    public Bar
{
   // ...
};
// ...
Foo::Foo
try :
    Bar ()
{
   // ...
}
catch (const std::exception& error)
{
   // ...
}

我不知道为什么,但这个构造对我来说很奇怪。不过它非常强大,因为它让我能够处理基类"内部"顶级构造函数抛出的异常。

我使用C++几年了,我想,我对这种语言很了解。。。这种方法有什么问题?为什么C++书中没有经常提到它?

真正的原因是在catch块中几乎没有什么可做的。你可以做一些类似登录的事情,或者抛出一个不同的异常,但如果你到达catch块的末尾而没有抛出,那么原始异常将自动重新抛出。

赫伯·萨特在这篇文章中很好地解释了这一切。

类构造函数很少能从其依赖项引发的异常中恢复。这就是为什么你不经常看到这种形式。另外,正如你所说,这看起来有点奇怪。

您可以捕获异常,但这对您没有多大帮助,因为您的对象还没有构造好。

您不能使用对象,也不能使用其成员。它违反了RAII。

您唯一能做的就是重新抛出异常,可能需要一些额外的信息来澄清情况。