是否可以在这些情况下处理异常:
答案 0 :(得分:22)
如何在构造函数中嵌入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'; }
};
答案 1 :(得分:4)
是:不要使用危险的全局对象!
答案 2 :(得分:0)
可以在构造/销毁有问题的对象之前设置异常处理程序,应该能够处理这些异常。
对于构造函数,有一些奇怪的新语法允许在构造函数中捕获异常。不确定它是如何工作的,并且它在许多编译器中并不常见。
对于析构函数,你必须在try {code();中包装析构函数的内容。 } catch(...){}阻止。这可能并不总是理想的行为,具体取决于您希望在析构函数中实现的目标。
答案 3 :(得分:0)
简答:不。
在其构造函数中抛出异常的任何全局对象都将导致未处理的异常(即,terminate
被调用)。
任何在析构函数中抛出异常的类都是一个破坏的类。
使用单例模式而不是全局变量将为您提供更多选项。