try/catchを使用せずに例外をキャッチする方法について読んだことを思い出します。基本的に、nullポインターの参照解除によって「未処理の例外」などの例外がスローされると、例外に対してtry/catchがコーディングされていない場合でもトリガーされるプロセスがあります。それは、あなたが書いた後、コードに含めるトップレベルのライブラリと関係があると思います。残念ながら、そのような方法に関するドキュメントは存在しないようですが、私は以前にそのような方法が行われているのを見たり聞いたりしました。誰かがこれがどのように行われるか説明してもらえますか?
3 に答える
C ++では、nullポインターを逆参照すると未定義の動作が発生しますが、これは必ずしも例外がスローされることを意味するわけではありません。たとえば、Unixシステムでは、代わりにSIGSEGV信号が発生します。
Windowsでは、アクセス違反によりSEH例外が発生します。SEH例外はC++例外と同じではありません。それらは__try/__except
(ステートメントではなくtry/catch
)ステートメントを使用して処理されます。未処理のSEH例外は、を使用して設定できる未処理の例外フィルターを呼び出しますSetUnhandledExceptionFilter
。
#include <Windows.h>
#include <iostream>
LONG WINAPI MyFilter(EXCEPTION_POINTERS * /*ExceptionInfo*/)
{
std::cout << "An uncaught exception was detected!\n";
// Ultimately causes Windows Error Reporting to be invoked.
// Use EXCEPTION_EXECUTE_HANDLER to silently terminate the application.
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
SetUnhandledExceptionFilter(MyFilter);
*(char volatile *)0 = 0;
}
Windowsの構造化例外処理メカニズムについて考えているかもしれません。完全なC++のtry/catchセマンティクスがサポートされているので、私は個人的にそれの合理的なユースケースを見つけられませんでした。
これはオペレーティングシステムの実装の詳細であり、nullポインタを逆参照してもC++例外は生成されません。SEH例外を生成するWindowsでは、MSVCコンパイラを使用すると、非標準の__tryおよび__exceptキーワードを使用してそれらを処理できます。シグナルを生成する*nixでは、signal.hヘッダーファイルの関数を使用します。