почему блок catch не разделяет область действия блока try?

Удивительно, но я не могу найти ответ на этот вопрос в поисковой системе SO (есть много похожих вопросов по SO, но связанных с другими языками).

Я подозреваю, что ответ: нет . Если да, то возникает очевидное неудобство, например

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; из попробуйте , я полагаю?

Я понимаю, что область действия определяется блоком {} , но это кажется разумным случаем, хм, исключением. Является ли причиной того, что объекты не могут быть полностью сконструированы при возникновении исключения?

13
задан davka 29 March 2011 в 17:39
поделиться