尝试/捕获类构造函数C++"中间"
try/catch "in the middle" of C++ class constructor
可能重复:
函数的try-catch语法之间的差异
几天前,我读了一本关于C++的书(它甚至可能是Bjarne Stroustrup的书),我在关于异常的章节中发现了这样的方法:
class Foo :
public Bar
{
// ...
};
// ...
Foo::Foo
try :
Bar ()
{
// ...
}
catch (const std::exception& error)
{
// ...
}
我不知道为什么,但这个构造对我来说很奇怪。不过它非常强大,因为它让我能够处理基类"内部"顶级构造函数抛出的异常。
我使用C++几年了,我想,我对这种语言很了解。。。这种方法有什么问题?为什么C++书中没有经常提到它?
真正的原因是在catch块中几乎没有什么可做的。你可以做一些类似登录的事情,或者抛出一个不同的异常,但如果你到达catch块的末尾而没有抛出,那么原始异常将自动重新抛出。
赫伯·萨特在这篇文章中很好地解释了这一切。
类构造函数很少能从其依赖项引发的异常中恢复。这就是为什么你不经常看到这种形式。另外,正如你所说,这看起来有点奇怪。
您可以捕获异常,但这对您没有多大帮助,因为您的对象还没有构造好。
您不能使用对象,也不能使用其成员。它违反了RAII。
您唯一能做的就是重新抛出异常,可能需要一些额外的信息来澄清情况。
相关文章:
- 2D数组来自文本输入,中间有空格
- 递归形成字符串中所有数字字符的中间和?
- 链表错误的中间
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 从函数返回范围视图时,带有std::span:中间对象所有权的C++Ranges-v3
- 如何输入数组的元素,每次获得新元素时,我们将其放在数组的中间?
- 查找中间两个数字的正则表达式的匹配项
- 我可以擦除 std::queue 中间的节点吗?
- 如何在标准c ++中流式传输/读取二进制文件的中间部分并写入另一个文件?
- 如何在 FOR 语句中间阻止 Visual Studio 2017 c++ 自动完成)?
- 给定类型的模板化中间数组
- 如何在文本文件中间插入字符
- 如何组合一个宽字符字符串,中间插入一些空字符
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?
- 尝试删除链表的头部或中间节点时出错
- 无法使用 Openvino 中间表示文件转发() 网络,但可以使用我正在制作 IR 的 ONNX 文件
- 如何让正则表达式匹配句子中间?
- 消除中间特征数组
- C++ 我想将两个字符串写入管道,中间有一小段延迟
- 从大范围内生成一个随机数,但从大范围的中间开始生成较小的范围