主要之前和之后的异常处理

shi*_*ing 8 c++ program-entry-point exception-handling

是否可以在这些场景中处理异常:

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

Kor*_*icz 22

  1. 您可以在其中包含try-catch来包装构造函数.
  2. 不,你永远不应该允许在析构函数中抛出异常.

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

object::object( int param )
try
  : optional( initialization )
{
   // ...
}
catch(...)
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

是的,这有效的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'; }
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,异常将始终在构造函数的末尾重新抛出(以防止存在具有未初始化成员的对象). (2认同)