最近我在写带有异常处理的代码,对于异常、它们的保证和可抛出性质,我有一些疑问。
基本上,假设你有以下代码:
class X {
string m_str;
X() : m_str("foo")//what if this throws?
{
ifstream b("a.in")//what if this throws?
}
经过查阅所有相关文章,我仍然不知道如何以清晰的方式处理这个问题。
假设我有以下代码:
{
...
X myInstanceOfClassX;
...
}
我应该在
catch(exception &)
中包裹代码吗?如果这样做,string
和ifstream
能够保证强异常安全性,确保没有资源泄漏和未关闭的文件吗?另外,如果我的类抛出从
exception
派生的myexception
,那么catch(exception &)
似乎会让它通过。所以我只能用catch(...)
,但我记得它会捕获访问冲突?还有其他方法吗?然后,有一个信息说如果对象构造函数的子构造函数引发异常,任何异常都不应该被捕获,构造函数应该在任何成员对象引发异常时抛出异常。
如果上面的代码不是从构造函数而是从常规函数
void foo()
调用的,我应该捕获哪些异常?outofmemory_something、filenotfound_something?我在哪里可以找到STL对象可能引发的定义?它们是特定于实现的吗?我在哪里可以找到权威来源来解决我对此话题的所有疑虑和问题?
到目前为止,处理异常就像在一堆粘液中跳舞。错误码似乎要简单得多且更安全...