Удивительно, но я не могу найти ответ на этот вопрос по поиску и поиску 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
, я предполагаю?
Я понимаю, что область видимости определяется блоком {}
, но это кажется разумным случаем для исключения hmm. Является ли причина того, что объекты могут быть не полностью построены, если выбрано исключение?