【发布时间】:2011-07-25 11:45:23
【问题描述】:
令人惊讶的是,我无法通过谷歌搜索和搜索 SO 找到答案(关于 SO 的类似问题很多,但与其他语言相关)。
我怀疑答案是no。如果是这样,就会有明显的不便,例如
try
{
std::string fname = constructFileName(); // can throw MyException
ofstream f;
f.exceptions(ofstream::failbit | ofstream::badbit);
f.open(fname.c_str());
// ...
}
catch (ofstream::failure &e)
{
cout << "opening file " << fname << " failed\n"; // fname is not in the scope
}
catch (MyException &e)
{
cout << "constructing file name failed\n";
}
如果我的假设是正确的,你会如何处理?通过将std::string fname; 移出try,我猜?
我知道范围是由 {} 块定义的,但这似乎是一个合理的情况,嗯,例外。是不是抛出异常导致对象不能完全构造的原因?
【问题讨论】:
-
就在现场。如果在
try { A a; B b; }中A的构造函数抛出,a和b都不能合理地在范围内。 -
除此之外,编译器可能不知道
constructFileName()是否可以抛出ofstream::failure。如果fname仍然在第一个catch块的范围内,请考虑何时将其破坏- 在catch 执行之后,但有条件地取决于抛出的来源。呸。您可以尝试告诉编译器每个函数抛出什么,但我不太喜欢对象的生命周期和范围取决于constructFileName()的异常规范。销毁在投掷点之前创建的所有内容要干净得多,然后处理 catch 子句。
标签: c++ exception-handling error-handling try-catch