はい、それは良い考えです。
例外をメインからエスケープさせると、アプリケーションがシャットダウンされる前にスタックが巻き戻されるのは、実装で定義された天気です。したがって、私の意見では、メインですべての例外をキャッチすることが不可欠です。
問題は、それらをどうするかということです。
一部のOS(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.
}
}
スレッドには影響しないはずです。通常、子スレッドを手動で結合して、それらが終了したことを確認する必要があります。メイン出口が明確に定義されていない場合に子スレッドに何が起こるかについての正確な詳細(ドキュメントを読んでください)が、通常、すべての子スレッドは即座に死にます(スタックの巻き戻しを伴わない厄介で恐ろしい死)。
子スレッドの例外について話している場合。繰り返しますが、これは明確に定義されていません(したがって、ドキュメントを読んでください)が、スレッドが例外を介して終了する場合(つまり、スレッドを開始するために使用される関数が例外のために終了し、戻りではない場合)、これにより通常、アプリケーションが終了します(同じ影響上記のように)。したがって、すべての例外がスレッドを終了するのを停止することが常に最善です。
- segfaultsの処理を中断しませんか(シグナルとして他の場所でキャプチャされます)
シグナルは、例外処理メカニズムの影響を受けません。
ただし、シグナルハンドラーはスタックに奇妙な構造を配置する可能性があるため(通常のコードに戻るために)、シグナルハンドラー内から例外をスローすることはお勧めできません。これは、予期しない結果を引き起こす可能性があるためです(また、移植性がないことは間違いありません)。 )。
- 予想される例外を処理するために存在する、必然的に内部にネストされた他のtry ... catchブロックには影響しませんか?
他のハンドラーには影響しないはずです。