2016-11-30 12 views
0

サードパーティのライブラリを使用するコードがあります。__try __exceptできない場合にC++でエラーをトラップする方法

このライブラリは、時折アクセス違反の例外をスローします。基本的なtry/catchはエラーを捕捉せず、プログラムはハードクラッシュします。

代わりに__try __exceptを使用して、エラーをキャッチしてログに記録し、プログラムを正常に終了することができました。

サードパーティがちょうど彼らのライブラリを更新しており、現在はアクセス違反のエラーを引き起こしていたレコードの小さなサブセットだけでVisual Studioで

「[プログラム名]は動作を停止しました」と制作に死にます、 Microsoft Visual Studio Cランタイムライブラリが[プログラム名]に致命的なエラーを検出しました。

私は__exceptステートメントを更新して、すべてをキャッチしています(つまり、私は信じています)。

オリジナル__except:

__except (eps = GetExceptionInformation(), ((GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) 
       ? EXCEPTION_EXECUTE_HANDLER 
       : EXCEPTION_CONTINUE_SEARCH)) { 
     sprintf("error message"); 
     result = 99; 
} 

新__except:FYI

__except (eps = GetExceptionInformation(), ((1 == 1) 
       ? EXCEPTION_EXECUTE_HANDLER 
       : EXCEPTION_CONTINUE_SEARCH)) { 
     sprintf("error message"); 
     result = 99; 
} 

答えて

0

単に優しいが、あなたの例外フィルタeps = GetExceptionInformation()の最初の式が使用されていないように見えます。

また、すべての例外をキャッチする場合は、__except (EXCEPTION_EXECUTE_HANDLER)が必要です。私はデバッグのためだけにそれをお勧めしますが。

例外が発生しない場合は、ライブラリ自体が例外を処理しようとしている可能性があり、ライブラリ自体に不具合が発生している可能性があります。私は図書館の提供者に確認し、これが既知の問題かどうか尋ねます。

+0

アドバイスいただきありがとうございました。 __except(EXCEPTION_EXECUTE_HANDLER) 他の2つと同じ結果が出ました。私は第三者に尋ねましたが、その時間枠は修正のために長すぎる傾向があります。そのため、アクセス違反を処理する必要があったのです。 –

+0

あなたはシンボルとソースコードにアクセスできますか?あなたは実際に例外がどのように起こっているのか把握するために、最後にそれを実際にデバッグできますか?例外が__except(EXCEPTION_EXECUTE_HANDLER)であっても決して捕捉されない場合は、ライブラリが例外を処理しようとしているので、コードが実際にそれを取得することはありません。 –

+0

残念ながら私はアクセス権がありません。私は彼らの開発者に、例のレコードの動作を引用して質問を出し、新しい動作の前/後のバージョン番号を聞いています。ご協力ありがとうございました。 –

関連する問題