【问题标题】:Catch error thrown by constructor in C++?在 C++ 中捕获构造函数抛出的错误?
【发布时间】:2015-12-06 22:27:06
【问题描述】:

我有一个类foo(我无法修改)只有一个构造函数接受一个这样的参数:

foo bar("Hello!");

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

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

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

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

【问题讨论】:

  • 把所有相关代码放在try块中。或者在你在 try 块中调用的函数中。
  • 有相关代码,是指使用对象的代码吗?那将意味着我的大部分程序。仅仅为了捕捉可能只在初始化期间发生的错误似乎有点过分?
  • 好吧,您的大部分程序都可以包含在main() 函数中,对吧?那么为什么不将它包含在您放入 try 块中的另一个函数中呢?
  • 如果您的整个程序都依赖于bar 对象并且它无法构造,那么您确实遇到了一些问题。
  • @MSalters 是的,我愿意。所以在这种情况下,我将中止程序。很抱歉对此不清楚。

标签: c++ error-handling constructor try-catch


【解决方案1】:

你可以使用堆分配:

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)

【讨论】:

  • 这将为您提供空指针取消引用。另外,为什么不std::unique_ptr
  • @MSalters:我假设在catch 正文中,他将解决问题,要么分配一个工作对象,要么只是中止程序,而不是在没有工作对象的情况下超出范围。使用“或使用智能指针”正是我正在考虑的......
  • 这是在我的main 中,在catch 中我只会打印一条错误消息和return
【解决方案2】:

问题很简单:构造函数失败了,所以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)

【讨论】:

  • 感谢您的回答!恐怕没有完全安全的已知输入,因为参数是要读取的文件。而且我认为 C++ 中没有 null 或类似的东西可以返回?
  • @Anders:对象不能是null。指针可以是nullptr。还有boost::optional&lt;foo&gt;,它可能持有也可能不持有foo。如果您的基本文件丢失,您当然可以打印一条错误消息并在 catch 中调用 exit(EXIT_FAILURE)
  • 不知道exit。这解决了我的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多