2016-10-20 7 views
0

私は何が起こったのかを確認するには、このテストをした:try/catchでsegfaultを捕まえることは可能ですか?

try 
{ 
    int *x = 0; 
    *x = 1234; 
} 
catch(...) 
{ 
    cout << "OK"; 
} 

しかし、それはセグメンテーションフォルトをスローし、なぜそれがセグメンテーションフォルトをキャッチしないのですか?

+0

ですが、やってトリッキーです正しく –

+3

segfaultはシグナルではありませんか? – cheroky

+0

@cheroky _ "セグメンテーションは例外ではありませんか?" –

答えて

2

いいえ、できません。

SEGFAULTは例外ではありません。

あなたが表示するコードは、単に未定義の動作であり、何かが起こる可能性があります。それが例外をスローするという保証はありません。

0

この回答はWINDOWSに固有です。

構造化例外処理を使用することができます。あなたがあなたのビジネスを取り扱い、ご登録された関数を定義したアプリケーション

SetUnhandledExceptionFilter(UnhandledExceptionFilterFunction); 

の先頭に関数を登録する必要が

あなたが「SetUnhandledExceptionFilter」 https://msdn.microsoft.com/en-us/library/ms680634(v=vs.85).aspx

の使用プロトタイプを呼び出す必要があります。 通常、人々はコアダンプを収集し、電子メールを開発チームに送信します。

LONG WINAPI UnhandledExceptionFilterFunction(PEXCEPTION_POINTERS exception) 
{ 


// The exception information is available in PEXCEPTION_POINTERS 

} 

は、ここでは、 "PEXCEPTION_POINTERS" で入手例外レコードのリストがあるPEXCEPTION_POINTERS https://msdn.microsoft.com/en-us/library/windows/desktop/ms679331(v=vs.85).aspx

のリンクの下に参照してください。最初のものは、あなたが、例外にセグメンテーション違反によってトリガ `SIGSEGV`信号を変換することができるかもしれOSに応じて、(LINUX用語のセグメンテーション違反で)「EXCEPTION_ACCESS_VIOLATION」

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363082(v=vs.85).aspx

+0

その質問がどのように窓に特有なのかわかりません。 –

+0

私は同意します。質問は窓に特有ではありません。だから私は私の答えで最初に言及したのです。しかし、このページに来るすべてのWindowsプログラマーを助けるかもしれません。 – Naidu

+0

LINUXやUNIX系のシステムでは、なぜそう考えることもできません。 – Naidu

関連する問題