为什么不捕获块共享try块的范围?

dav*_*vka 13 c++ error-handling exception-handling try-catch

令人惊讶的是,我无法通过谷歌搜索和搜索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";
}
Run Code Online (Sandbox Code Playgroud)

如果我的假设是正确的,你如何处理这个?通过std::string fname;移出try,我想?

我理解范围是由一个{}块定义的,但这似乎是一个合理的例子,例如,嗯.是否抛出异常导致对象无法完全构造的原因是什么?

Jam*_*lis 21

catch块是否共享块的范围try

没有.

你怎么处理这个?通过std::string fname;移出try,我想?

是.

我理解范围是由一个{}块定义的,但这似乎是一个合理的例子,例如,嗯.是否抛出异常导致对象无法完全构造的原因是什么?

C++需要的最后一件事是规则更复杂的规则和例外.:-)


Han*_*ant 6

有一个明显的原因:你不能相信在try块中创建的对象的状态.那里的代码被异常打断了,他们的构造函数可能还没有运行.

  • @Étienne 这不是一个合适的比较。在 Python 中,您引用的变量是在运行时动态确定的。因此,如果未构造变量,则该名称甚至不存在。在 C++ 中,情况并非如此。 (2认同)