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