LINUX.ORG.RU

История изменений

Исправление 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();