0

サードパーティのライブラリを使用してプログラムをコンパイルしています。エラーが内部で発生した場合、そのライブラリにはエラーコールバックが含まれます。そのエラーコールバック内で例外をスローしています。ユニットテストを実行して、無効な処理を行ったときに例外がスローされることを確認します。これはすべてWindowsでうまく機能しますが、Linux(fedora)でこれをテストすると、キャッチされない例外からアボートが発生します。

try-catchブロックを使用して呼び出しを直接ラップしようとしましたが、うまくいきませんでした。(また、私のコードはすべてgoogle testフレームワーク内で実行されており、通常は例外もキャッチします)。例外をキャッチしているように見える唯一のことは、throwステートメントをエラーコールバック内で直接tryブロックにラップする場合です。

なぜこれが発生するのか、例外をキャッチする方法があるのか​​、誰かが知っていますか?

4

2 に答える 2

3

サードパーティのライブラリとインターフェイスする場合、通常、コードとそのコードの境界ですべての例外をキャッチする必要があります。

int yourCallback( params )
{
    try {
      doStuff( params );
      return Okay;
    } catch (...) {
      return Error;
    }
}

その理由は、ライブラリがC ++で記述されているか、コードが使用しているのとまったく同じバージョンのC++ランタイムを使用しているかを確認できないためです。

コードが例外を処理できることを完全に確信していない限り、サードパーティのコードに例外を伝播することはできません。極端な例はCOMであり、コードと「その他のコード」の両方をどの言語でもどのランタイムでも使用でき、例外をCOM境界を介して伝播させることはできません。

于 2011-06-06T14:33:48.383 に答える
1

通常、何も知らないコードを「介して」例外をスローするべきではありません。それはCコードである可能性があり、それ自体はクリーンアップすらしません。

具体的な問題に対処するには、インターフェースしているサードパーティのライブラリに関する具体的な情報が必要になります。そのコールバックは何のためにありますか?あなたに何かを修正する機会を与えるために?エラーが発生したことを通知するには?呼び出された操作をキャンセルできますか?
このようなシナリオに対処する1つの方法は、コールバックが呼び出されたときに情報をどこかに格納し、そのライブラリを呼び出す関数から実際の処理が終了したときにその情報を確認することです。

于 2011-06-06T14:34:41.313 に答える