初めに:
あなたはそれをしたくありません。
例外は、バグを処理するためのものではありませんが、関数が呼び出す必要がある他の関数の事前条件を満たせなくなったり、独自の事後条件を満たしているという約束を維持したりすることを不可能にする実行時エラー状態です (呼び出し元が前提条件を満たしている)。たとえば、Herb Sutter によるこの記事を参照してください。
次のようなことは絶対に書かないでください。
try
{
//bug condition <== NO! Exceptions are not meant to handle bugs
}
catch()
{
//Remove file
}
むしろ:
assert( /* bug condition... */ );
質問に戻る:
プログラムには未定義の動作があり、ほとんどの場合、次のようにしても例外はまったくスローされません。
char TempArray[10];
char c = TempArray[11];
したがって、すべての例外をキャッチしても役に立ちません。これはバグ、つまりプログラミングエラーであり、制御をバグのあるルーチンに移す方法でバグを処理する必要があるかどうかは議論の余地があります。さらに、プログラムにバグが存在することを認めている場合、制御をバグのあるハンドラーに移しているだけではないでしょうか? それはそれをさらに悪化させる可能性があります。
バグは、アサーションを利用し、おそらくテスト駆動開発などの方法論を採用して、それらを防止することによって対処する必要があります。
これは、すべての例外をキャッチする方法に関して、次のことができると述べました。
try
{
// ...
}
catch (...) // <== THIS WILL CATCH ANY EXCEPTION
{
}
ただしcatch (...)
、設計ガイドラインとして使用することはお勧めできません。これは、処理されるはずのエラー条件を簡単に飲み込んで忘れてしまうためです。結局のところ、例外は、プログラマーがエラー コードのチェックを忘れないようにするために考案されたものでありcatch (...)
、それを非常に簡単にします。
すべてをキャッチするには、すべての例外を から派生させてからstd::exception
、次のようにする方がよいでしょう。
try
{
// ...
}
catch (std::exception& e)
{
// Do something with e...
}