gpt4 book ai didi

c++ - 构造函数 : init() method, 指针中的异常,大型 try/catch 或..?

转载 作者:行者123 更新时间:2023-11-30 05:05:01 31 4
gpt4 key购买 nike

我正在处理一个可能引发错误的对象构造函数。我有以下选择。

1) 有一个非常大的 try block ,它包含所有需要该对象的代码(由于对象范围):

try {
Object a(input_vars); // This can throw
// Do
// loads of stuff
// with a here
} catch (exception e) {
// Do something with exception
}

我对此不是特别满意,因为它会包含非常大的代码部分。尽管如此,也许这里是最吸引人的选项。

2) 将 throw 移至 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 的代码要么必须始终考虑到这种可能性,要么最好完全跳过。

关于c++ - 构造函数 : init() method, 指针中的异常,大型 try/catch 或..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48584431/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com