Да, это хорошая идея.
Если вы позволите исключению выйти из основного режима, это будет зависеть от реализации, если стек разматывается до закрытия приложения. Поэтому, на мой взгляд, важно, чтобы вы поймали все исключения в основном.
Тогда возникает вопрос, что с ними делать.
Некоторые ОС (см. MS и SE) предоставляют некоторые дополнительные средства отладки, поэтому полезно просто перезапустить исключение после того, как вы его перехватите (потому что в любом случае стек был размотан).
int main()
{
try
{
/// All real code
}
// I see little point in catching other exceptions at this point
// (apart from better logging maybe). If the exception could have been caught
// and fixed you should have done it before here.
catch(std::exception const& e)
{
// Log e.what() Slightly better error message than ...
throw;
}
catch(...) // Catch all exceptions. Force the stack to unwind correctly.
{
// You may want to log something it seems polite.
throw; // Re-throw the exception so OS gives you a debug opportunity.
}
}
- Будет ли это хорошо работать с потоками, которые появятся позже?
Это не должно влиять на потоки. Обычно вы должны вручную присоединять любые дочерние потоки, чтобы убедиться, что они завершены. Точные детали того, что происходит с дочерними потоками, когда главные выходы не определены четко (так что читайте документацию), но обычно все дочерние потоки умирают мгновенно (неприятная и ужасная смерть, которая не предполагает разматывания их стеков).
Если вы говорите об исключениях в дочерних потоках. Опять же, это не очень хорошо определено (так что читайте документацию), но если поток выходит через исключение (то есть функция, используемая для запуска потока, выходит из-за исключения, а не возврата), то это обычно приводит к завершению приложения (то же самое влияет как указано выше). Поэтому всегда лучше остановить ALL исключений при выходе из потока.
- не нарушит ли он обработку ошибок (захваченных в другом месте как сигнал)
На сигналы не влияет механизм обработки исключений.
Но поскольку обработчики сигналов могут помещать в стек нечетную структуру (для их собственной обработки возврата обратно в обычный код), не рекомендуется генерировать исключение из обработчика сигналов, поскольку это может привести к непредвиденным результатам (и, безусловно, не переносимо). ).
- не повлияет ли это на другие блоки try ... catch, неизбежно вложенные внутрь, которые предназначены для обработки ожидаемых исключений?
Не должно влиять на другие обработчики.