gpt4 book ai didi

C++:如何捕获构造函数抛出的异常?

转载 作者:太空狗 更新时间:2023-10-29 21:13:08 24 4
gpt4 key购买 nike

我有一个类,称之为 A,它的构造函数接受一些输入参数,如果它们与构造该对象不兼容,则可能会抛出异常。在我的 main 代码中,我构造了一个 A 类型的对象,如下所示:

A my_obj(arg1,arg2,arg3);

并使用它。显然,如果构造函数失败并抛出异常,则程序将在打印出“未处理的异常”消息后终止执行。

但是,在这种情况下,我想为用户提供更多信息,并告诉他/她为什么会抛出 exception。所以,我需要一种方法来捕获异常。

为此,一种可能性是将整个代码封装起来,从 my_obj 的声明开始直到程序结束在 try block 和 中之后捕获异常:

try {
A my_obj(arg1, arg2, arg3);
// ...
// about 100 other lines of code being executed if my_obj is created properly
}
catch (std::exception& e) {
// print a user-friendly error message and exit
}

但在我看来,这有点“矫枉过正”。特别是因为在剩余的 100 行中没有抛出其他异常。有没有其他更好的方法来实现这一点?

最佳答案

如果构造函数抛出异常,则您没有对象。 std::optional<>是一种表示“我们这里可能没有对象”的类型。

template <typename T, typename ... Args>
std::optional<T> try_make(Args&& ... args)
{ try {
return make_optional(std::forward(args...));
} catch (...) {
return {};
} }

然后

auto my_obj = try_make<A>(arg1,arg2,arg3);
if (my_obj) {
// about 100 other lines of code being executed if my_obj is created properly
}

关于C++:如何捕获构造函数抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45370054/

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