使用している場合は、使用し__try{ } __except()
ないでください。
それらと C++ コードはうまく混ざりません。(たとえば、関数のスタックに C++ オブジェクトをラップすることはできません。 (省略記号try {} catch() {}
を使用して) C++ を使用する場合は、C++ を使用する必要があります。catch(...)
基本的には、__except()
両方ともtry.. catch
、__try .. __except
デバッグとリリースで同じように動作します。
問題が予期しない例外であると思われる場合は、次のすべてについて読む必要があります。
SetUnhandledExceptionFilter()
_set_se_translator()
_CrtSetReportMode()
_RTC_SetErrorFunc()
_set_abort_behavior()
_set_error_mode()
_set_new_handler()
_set_new_mode()
_set_purecall_handler()
set_terminate()
set_unexpected()
_set_invalid_parameter_handler()
_controlfp()
最初の 2 つのいずれかを使用すると、問題をかなり迅速に特定できる可能性があります。プロセスで発生する可能性のあるすべてのエラーケースを完全に制御したい場合は、残りがあります。
具体的にはSetUnhandledExceptionFilter()
、例外の原因となったコードのアドレスをログに記録する関数フィルターを設定できます。その後、デバッガーを使用してそのコードを特定できます。DbgHelp ライブラリを使用し、フィルター関数に与えられた情報を使用して、シンボルや行番号を含むクラッシュの完全なスタック トレースを出力するコードを記述できます。
リリース ビルドのデバッグ シンボルも出力するようにビルド構成を設定してください。それらはアプリケーションを遅くするのを助けるだけで、何もしません (ただし、アプリケーションを大きくする可能性があります)。