Для переносимости, одна вещь, которую нужно попробовать - это использовать блоки try-catch для большинства исключений ванили, а затем установить обработчик завершения (set_terminate_handler), чтобы иметь минимальный доступный хук для катастрофических условий выхода. Вы также можете попробовать добавить что-то вроде обработчика atexit или on_exit. Конечно, ваша среда выполнения может быть странной или поврежденной, когда вы входите в эти функции, поэтому будьте осторожны с тем, насколько вы предполагаете нормальную среду.
Наконец, при использовании обычных пар try-catch вы можете рассмотреть возможность использования блоков try функции вместо открытия блока try в теле функции:
int foo(int x) try {
// body of foo
} catch (...) {
// be careful what's done here!
}
это относительно неизвестный кусок C ++ и может в некоторых случаях предлагать восстановление даже в случае частичного (мелкомасштабного) повреждения стека.
Наконец, да, вы, вероятно, захотите выяснить, какие сигналы вы можете обрабатывать самостоятельно, а какие можно прервать, и, если вы хотите использовать меньше механизмов обработки, вы могли бы рассмотреть возможность вызова не генерирующей версии оператор new и компиляция, чтобы при необходимости не генерировать исключения с плавающей запятой (вы всегда можете проверить isnan (.), isfinite (.) в результатах FP, чтобы защитить себя).
В этом последнем примечании, будьте осторожны: я заметил, что функции классификации результатов с плавающей запятой могут находиться в разных заголовках под linux и windows ... так что вам, возможно, придется обусловить эти включения.
Если вы чувствуете себя отважным, напишите все это, используя setjmp и longjmp (это шутка ...).