c++中构造函数抛出的Catch错误

Catch error thrown by constructor in C++?

本文关键字:Catch 错误 构造函数 c++      更新时间:2023-10-16

我有一个类foo(我不能修改),只有一个构造函数,接受一个参数,像这样:

foo bar("Hello!");

因为构造函数可以抛出错误,所以我想实现错误处理。我的第一次尝试是这样的:

try {
    foo bar("Hello!");
}
catch {
    cerr << "Something went horribly wrong...";
    return -1;
}

但是,现在footry块的范围内,不能在其他地方使用。如果我理解正确的话,我不能在没有初始化的情况下声明一个对象,所以我可以在try块之外声明bar。那么,如何捕获构造函数抛出的错误呢?

EDIT:澄清一下,这是在我的main中,在catch中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的永远不会引发异常的安全输入。

问题相当简单:构造函数失败,因此从未创建bar对象。c++强制执行这一点,并防止在这种情况下使用bar

你可以用另一种方法解决这个问题:

foo makeFoo()
{
   try {
     return foo("Hello!"); // May throw
   }
   catch(...) {
     return foo("Safe"); // We know that "Safe" will not throw.
   }
}
bar foo{makeFoo()};

如果要在抛出异常时退出程序,可以打印错误消息并在catch中调用exit(EXIT_FAILURE)

你可以使用堆分配:

foo *p = 0;
try {
    p = new foo("parm");
} catch(const Error& err) {
    ...
}
foo& instance = *p;
// Here you can use instance normally...
delete p; // destroy before leaving scope (or use a smart pointer)