Правильно ли я рассматриваю обработчик в main как «последний обработчик?»
Да, вы.
И поэтому в HandleException разрешено любое количество повторных бросков и ловушек без разрушения объекта текущего исключения?
Да. Объект исключения, который окончательно не обработан, будет уничтожен сгенерированным компилятором кодом. Никаких утечек памяти не будет.
Не стоит перебрасывать HandleException()
. Вместо
1. записывать уловы в любой тип исключения, который запрашивает определенную обработку
2. вы можете сгруппировать обработку исключений, используя dynamic_cast
. Поймайте базовый тип исключения и попытайтесь уменьшить его до любого из его производных классов исключений. НО dynamic_cast
не является хорошей практикой. Так что лучше использовать 1-е решение.
Лучше переписать ваш код следующим образом:
struct ExceptionBase : virtual std::exception{};
struct SomeSpecificError : virtual ExceptionBase{};
struct SomeOtherError : virtual ExceptionBase{};
void MightThrow();
void HandleExceptionBase();
int main()
{
try
{
MightThrow();
}
catch (SomeOtherError &error) {
// first common code
HandleExceptionBase();
// react on this exception correctly
// specific code
}
catch (SomeSpecificError &error) {
// first common code
HandleExceptionBase();
// react on this exception correctly
// specific code
}
catch (ExceptionBase &error) {
HandleExceptionBase();
// finally catch anything derived from base class
// react on this exception correctly
}
catch(...) {
// react on any other exception except 3 listed above
}
}
void MightThrow()
{
throw SomeSpecificError();
}
void HandleExceptionBase() {
// base exception handler
}