Существует один трюк, который вы можете использовать:
catch(...) {
handle_exception();
}
void handle_exception() {
try {
throw;
} catch (const std::exception &e) {
std::cout << e.what() << "\n";
} catch (const int i) {
std::cout << i << "\n";
} catch (const long l) {
std::cout << l << "\n";
} catch (const char *p) {
std::cout << p << "\n";
} catch (...) {
std::cout << "nope, sorry, I really have no clue what that is\n";
}
и т. Д. Для стольких различных типов, сколько вы думаете, может быть выброшено.Если вы действительно ничего не знаете о том, что может быть выброшено, то даже этот второй-последний неверен, потому что кто-то может выбросить char*
, который не указывает на строку с нулевым символом в конце.
Обычно этоплохая идея бросать что-либо, что не является std::exception
или производным классом.Причина, по которой существует std::exception
, заключается в том, что каждый может бросать и ловить предметы, с которыми он может сделать что-то полезное.В игрушечной программе, где вы просто хотите выбраться оттуда и даже не можете добавить стандартный заголовок, хорошо, возможно, выведите int
или строковый литерал.Я не думаю, что сделал бы эту часть формального интерфейса.Любые исключения, которые вы выбрасываете, являются частью вашего официального интерфейса, даже если вы как-то забыли их документировать.