是否可以在这些情况下处理异常:
- 在进入 main() 之前从构造函数中抛出
- 离开 main() 后从析构函数中抛出
如何在构造函数中嵌入 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'; }
};
是的:不要使用危险的全局对象!
可以在构造/销毁相关对象之前设置异常处理程序,以便能够处理这些异常。
对于构造函数,有一些奇怪的新语法允许在构造函数中捕获异常。不确定它是如何工作的,而且它在许多编译器中并不常见。
对于析构函数,您必须将析构函数的内容包装在 try { code(); } catch(...) {} 块。这可能并不总是理想的行为,具体取决于您希望在该析构函数中实现的目标。
简短的回答:没有。
任何在其构造函数中抛出异常的全局对象都会导致未处理的异常(即被terminate
调用)。
任何在其析构函数中抛出异常的类都是损坏的类。
使用单例模式而不是全局模式将为您提供更多选择。