В Linux сигналы unix обычно не запускают обработчики исключений. Кроме того, вообще говоря, небезопасно выбрасывать исключение из обработчика сигнала (как минимум, вы должны скомпилировать с -fnon-call-exceptions
; даже тогда я видел смешанные отчеты).
Обратите внимание, что вы всегда должны ловить исключения по ссылке, чтобы избежать нарезки:
catch (CotsException &ce)
{
// ...
}
Вкратце: если ваша сторонняя библиотека позволяет распространению исключения C ++ без перехвата, да, это ударит по вашему приложению. Если он получен из std :: exception или другого распространенного типа, вы должны быть в состоянии его перехватить. Если это какой-то внутренний тип, который вам не доступен, вы не сможете поймать его по имени (но catch (...)
должен его поймать). Исключения процессора (деление на ноль, ошибки сегмента и т. Д.) Не будут автоматически вызывать исключения C ++, если только вы или библиотека не установите обработчик сигнала для его преобразования; в этом случае код, запускающий сигнал, ДОЛЖЕН быть собран с -fnon-call-exceptions
, чтобы стек работал для правильной работы.
Как правило, если библиотека вызывает ошибку, такую как SIGFPU или SIGSEGV, результаты попытки восстановления с исключением являются непредсказуемыми; библиотека может не ожидать, что она размотает свой стек в этот момент, и с SIGSEGV вы можете иметь повреждение кучи, которое приводит к сбою самой системы исключения. Я бы не советовал пытаться восстановиться таким способом - просто позвольте процессу умереть.