Обычное правило заключается в том, что блок catch
не перебрасывается, пока вы не попросите об этом.Как бы вы остановили распространение исключения в противном случае.Однако в случае конструктора, если что-то в списке инициализации выбрасывается, значит, у вас нет полностью сконструированного объекта;Вы ничего не можете сделать с объектом, даже не вызвать деструктор к нему.И если блок функции catch
конструктора не перебрасывается, что он собирается делать, поскольку он не может просто вернуть (и оставить переменную в стеке)?
Во всех остальных случаях этоВверх выполните функцию, содержащую блок catch
, чтобы узнать, что делать.Например, в случае с main вы можете написать: try {ab bb;} catch (...) {} std :: cout << "Возобновление выполнения!"<< std :: endl; </p>
Чего вы не можете сделать, так это выполнить код, в котором bb
находился бы в области видимости и был бы доступен, но не был правильно построен.
Что касается того, почему выне следует помещать блок try функции в деструктор базового класса, я никогда не слышал этого правила.В общем, деструкторы не должны выбрасывать, так что нет смысла заключать их в блок try, точка.