私のアプリケーションが3つのコンポーネントで構成されているとします。彼らは以下のとおりです。ネイティブコードから例外を処理する方法は?
- C++のネイティブライブラリネイティブライブラリ
- C#のGUIアプリケーションをラップ
- C++ CLI管理ライブラリ。
私が理解するように、ネイティブのC++ライブラリからスローされたネイティブ例外は、SEHException管理クラスでラップされます。私は次のステップに興味があり、そのような例外オブジェクトの作成後に行うことが推奨されています。
C++ cliマネージライブラリ内で考えられるすべての例外をキャッチして、適切な管理例外を作成する必要がありますか?このようなもの:
void some_managed_action()
{
try
{
native_object->some_native_action();
}
catch (const NativeException& e)
{
// What should I do with exception e and native object? before throwing new managed exception
// Will SEH wrapper automatically delete native exception object
// delete all native objects?
throw gcnew ManagedException(get_message(e));
}
}
このようなアプローチにはいくつかの落とし穴がありますか?アドバイスありがとう。
このコードで何かを変更する明確な理由はありません。おそらく、例外タイプ名の他に、 "UnmanagedException"は、それがどこから来たのかという点でより意味があります。 C#コードでは、エラー報告以外の何かを合理的に行うことはできませんが、より詳細な情報を提供することができます。 –
@Hans Passant私が理解しているように、ネイティブオブジェクトによる例外をキャッチすることは、appropよりも好ましいです。ラップされた管理されたもの?管理対象の型がcatch(Object ^)によってキャッチされた場合、スローされたオブジェクトは破棄されません。 – LmTinyToon
あなたのスニペットに "NativeException"と書くと、誰もがそれがネイティブのC++タイプとみなされます。それだけでなく、例外オブジェクトから情報を取得する必要があります。すべての関連情報なしで例外を渡すことは、非常に悪い考えです。それでも動作しますが、もちろんC#コードでは何もできませんが、プログラムを終了します。したがって、ネイティブ例外オブジェクトがリークされたかどうかはまったく問題になりません。 –