История изменений
Исправление monk, (текущая версия) :
Это будет уже другой C++
С++ с отлавливаемыми исключениями в деструкторе уже другой. По определению. Ладно, для совместимости пусть будет:
catch (exception &e) { /* поймали exception */ }
catchmany (exception *e) { /* поймали много exception */ }
То, что вы написали уже есть и работает.
Сейчас не работает. Исключение при выходе из деструктора обвалит программу.
исключения из деструкторов invalid_user::username_ и invalid_user::password_ перехватываются и обрабатываются до вызова деструктора std::runtime_error
Если обязательно обрабатываются до вызова, то тогда их ловить можно только внутри деструктора invalid_user. Иначе они просто попадут в список исключений.
деструктор invalid_user выпустит исключение. До вызова b(). Именно эту ситуацию и требуется обработать, чтобы b() таки была вызвана.
a();
try {
try { ... }
catch( const invalid_user & x ) {...}
} catch (...) { обработать ошибку invalid_user }
b();
Исходная версия monk, :
Это будет уже другой C++
С++ с отлавливаемыми исключениями в деструкторе уже другой. По определению. Ладно, для совместимости пусть будет:
catch (exception &e) { /* поймали exception */ }
catchmany (exception *e) { /* поймали много exception */ }
То, что вы написали уже есть и работает.
Сейчас не работает. Исключение при выходе из деструктора обвалит программу.
исключения из деструкторов invalid_user::username_ и invalid_user::password_ перехватываются и обрабатываются до вызова деструктора std::runtime_error
Если обязательно обрабатываются до вызова, то тогда их ловить можно только внутри деструктора invalid_user. Иначе они просто попадут в список исключений.
деструктор invalid_user выпустит исключение. До вызова b(). Именно эту ситуацию и требуется обработать, чтобы b() таки была вызвана.
a();
try {
try { ... }
catch( const invalid_user & x ) {...}
} catch (...) { обработать ошибку invalid_user }
b();