2009-09-03 26 views
14

例外をスローするサードパーティライブラリがあります。だから私はtry/catch(...)で自分のコードをラップすることで、例外についての情報を記録できるようにしました(具体的な詳細はなく、ちょうど起こった)。クラッシュします。クライアントコンピュータでは、ハードウェアがクラッシュし、catch(...)で例外を記録するコードは実行されません。デバッグ/開発マシンでこれを実行すると、デバッグするかどうかを確認するポップアップが表示されます。私はこれを行うと0xC0000005:XXXという場所を読み取っているアクセス違反を報告します。catch(...)を使用してC++例外をキャッチできません

奇妙なことは、古いバージョンのサードパーティ製ライブラリでは、まったく同じコードが例外をキャッチし、例外をログに記録するコードが実行されることです。 (私は同じ状況が発生見VS以内にこれを検証した。)ここで

が実行されている擬似コードです:
  1. は、いくつかの変更がある:

    だから私は2つの質問があります私のコードが例外を捕まえることができないように、第三者が図書館をコンパイルしているかもしれません。 (はい、あなたが何を伝えるべきかを知っていれば、私が必要とする修正が必要なものを作り直す機会があります)

  2. 私はそれを修正することはできませんこれらの例外をキャッチするために私は何ができますか?私は...の行に沿って考えています... pObjectが割り当て解除されたかどうかを判断する方法はありますか?

答えて

11

AFAIKアクセス違反...例外をスローしません...少なくとも標準ではありません!

はたぶん、Windows固有の「ネイティブ」例外が役立つだろうキャッチ:http://www.gamedev.net/reference/articles/article2488.asp

+0

これは本当に役に立つ記事であり、実際には私にとって実行可能なソリューションが含まれています...古いライブラリはVS2003で構築しなければならず、新しいライブラリはVS2008向けです。 w/optionをコンパイルするようにライブラリを設定した後、 "Enable C++ Exceptions:Yes SEH Exceptions(/ EHa)"でコードがこのインスタンスをキャッチします。この理由から、私はこの回答に正しい答えを与えています。 しかし、他の回答のいくつかは有効な有用​​な情報を提供していると言いたいと思います。 –

+4

C++ try/catchでSEH例外を捕まえることは、一般的には悪い考えです。 MSがデフォルトで新しいコンパイラでそれを無効にした理由があります。通常、コンパイラオプションを有効にするのではなく、SEH構造(__try/__ exceptなど)を使用する必要があります。 – jalf

+0

マイケル・ブレイ>問題はありませんが、この種の問題に役立つ多くの回答があると思います。私は他の人にも投票して、この答えの下でそれらを作ることにします。 jalf>確かに。それは彼らが記事で行うことです。 – Klaim

0

あなたが記述どのようなことは、非常に多くのように::終了(に見える)C++ランタイムによって呼び出されています。

は、これは通常、いわゆるダブル例外によって引き起こされる - どこかの例外がスローされ、スタックの巻き戻しが開始され、スタックの巻き戻し中に呼び出さデストラクタの一つにも例外がスローされます。この場合、:: terminate()が呼び出され、プログラムを本当に助けることはできません。

この場合、唯一の回避策は、例外がデストラクタの外に出てこないライブラリの新しいバージョンを取得することです。ライブラリーにcall :: set_terminate()をロードしてから、あなた自身の関数を提供し、プログラムがクラッシュする前に呼び出されているかどうかを確認した後で、これを非常に簡単に検証することができます。

1

あなたがWindowsプラットフォーム上にある場合は、しかし__try

を見てみてください、あなたは例外を分離して扱うことができ、本当にわからない限り継続実行中の多くの使用がないことに注意してください。

8

アクセス違反はC++例外ではありません。これは、Windows Structured Exceptionです。 catch(...)でcatchする場合は、_set_se_translator()を使用する必要があります。

あなたはおそらくgoogleのすべての理由でcatch(...)は悪であり、本当にこれをしたいことを確認してください。

+0

これは情報の良いビットです...しかし、私の場合は、main()関数(少なくとも上記のsharptoothで参照されている記事の例による)で_set_se_translator()を使用しなければならないようです。私が言及しなかったことは、私のコードは実際には別のアプリケーション(実際には第三者アプリケーション)によってロードされているcomオブジェクトであり、私は使用中のmain()を制御できません。そうでなければ、これが最善の道だったと思います。 –

+0

Ooops私はKlaimの記事で言及していました。ごめんなさい! –

関連する問題