8

是否可以在这些情况下处理异常:

  1. 在进入 main() 之前从构造函数中抛出
  2. 离开 main() 后从析构函数中抛出
4

4 回答 4

22
  1. 您可以在构造函数中使用 try-catch 来包装构造函数。
  2. 不,你不应该允许在析构函数中抛出异常。

如何在构造函数中嵌入 try-catch 的有趣鲜为人知的特性:

object::object( int param )
try
  : optional( initialization )
{
   // ...
}
catch(...)
{
   // ...
}

是的,这有效的 C++。这里的额外好处是 try 将捕获类的数据成员的构造函数抛出的异常,即使它们没有在 ctor 初始化程序中提及或没有 ctor 初始化程序:

struct Throws {
  int answer;
  Throws() : answer(((throw std::runtime_error("whoosh!")), 42)) {}
};

struct Contains {
  Throws baseball;
  Contains() try {} catch (std::exception& e) { std::cerr << e.what() << '\n'; }
};
于 2010-01-08T08:28:34.867 回答
4

是的:不要使用危险的全局对象!

于 2010-01-08T08:37:07.093 回答
0

可以在构造/销毁相关对象之前设置异常处理程序,以便能够处理这些异常。

对于构造函数,有一些奇怪的新语法允许在构造函数中捕获异常。不确定它是如何工作的,而且它在许多编译器中并不常见。

对于析构函数,您必须将析构函数的内容包装在 try { code(); } catch(...) {} 块。这可能并不总是理想的行为,具体取决于您希望在该析构函数中实现的目标。

于 2010-01-08T08:28:31.340 回答
0

简短的回答:没有。

任何在其构造函数中抛出异常的全局对象都会导致未处理的异常(即被terminate调用)。

任何在其析构函数中抛出异常的类都是损坏的类。

使用单例模式而不是全局模式将为您提供更多选择。

于 2010-01-08T09:27:41.767 回答