构造函数中的异常:init() 方法、指针、大型 try/catch 或
Exception in constructor: init() method, pointers, large try/catch or..?
我正在处理一个可能引发错误的对象构造函数。我有以下选择。
1(有一个非常大的try
块,它包含了所有需要对象的代码(因为对象范围(:
try {
Object a(input_vars); // This can throw
// Do
// loads of stuff
// with a here
} catch (exception e) {
// Do something with exception
}
我对此不是特别满意,因为它将包含一个非常大的代码部分。不过,也许是这里最吸引人的选择。
2( 将抛出移动到 init(( 方法:
Object a(input_vars); // This one does not throw
try {
a.init(); // Only this one can throw
} catch (exception e) {
// Do something with exception (EDIT: and terminate)
}
// Do some stuff with a
但是,这会导致对象被半构造,要求人们记住调用 init((,并违反资源获取即初始化 (RAII(。
3( 仅使用指针:
Object* a;
try {
a = new Object(input_vars); // This one can throw
} catch (exception e) {
// Do something with exception (EDIT: and terminate)
}
// Do some stuff with a
delete a;
这需要记住销毁对象。它还增加了悬垂指针等的风险。
您更喜欢上述哪一个选项,出于什么原因?还有其他我没有考虑过的选择吗?
选项 1( 是正确的。原因:当构造函数抛出时,对象a
构造失败,因此不存在任何有效状态。以下使用 a
的代码要么必须始终编写以考虑这种可能性,要么最好完全跳过它。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- C++中高效的大型稀疏块压缩线性方程
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 构造函数中的异常:init() 方法、指针、大型 try/catch 或
- 封装与大型C 对象中的指针返回
- 我们是否应该将指向类实例的智能指针存储在大型 std::vector 中以获得更好的性能?
- 如何实现大型非指针成员的移动构造函数
- C++:使用指针存储/访问大型对象以避免内存不足
- 使用固定指针将大型数据结构传递给非托管代码
- 单线程共享指针,可简单地包含在大型项目中
- 如何处理大型指针结构
- 移动大型非指针基对象的语义