2016-11-07 17 views
1

私のアプリケーションが3つのコンポーネントで構成されているとします。彼らは以下のとおりです。ネイティブコードから例外を処理する方法は?

  1. C++のネイティブライブラリネイティブライブラリ
  2. C#のGUIアプリケーションをラップ
  3. 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)); 
    } 
} 

このようなアプローチにはいくつかの落とし穴がありますか?アドバイスありがとう。

+0

このコードで何かを変更する明確な理由はありません。おそらく、例外タイプ名の他に、 "UnmanagedException"は、それがどこから来たのかという点でより意味があります。 C#コードでは、エラー報告以外の何かを合理的に行うことはできませんが、より詳細な情報を提供することができます。 –

+0

@Hans Passant私が理解しているように、ネイティブオブジェクトによる例外をキャッチすることは、appropよりも好ましいです。ラップされた管理されたもの?管理対象の型がcatch(Object ^)によってキャッチされた場合、スローされたオブジェクトは破棄されません。 – LmTinyToon

+1

あなたのスニペットに "NativeException"と書くと、誰もがそれがネイティブのC++タイプとみなされます。それだけでなく、例外オブジェクトから情報を取得する必要があります。すべての関連情報なしで例外を渡すことは、非常に悪い考えです。それでも動作しますが、もちろんC#コードでは何もできませんが、プログラムを終了します。したがって、ネイティブ例外オブジェクトがリークされたかどうかはまったく問題になりません。 –

答えて

1

使用

try 
{ 
} 
catch (Exception ex) 
{ 
    // .NET exception 
} 
catch 
{ 
    // native exception 
} 

例外を処理するcatchブロックでは、すべての共通言語 仕様(CLS)に準拠した例外をキャッチします。ただし、非CLS準拠の例外は、 をキャッチしません。非CLS準拠の例外は、 ネイティブコードまたは Microsoft中間言語(MSIL)アセンブラによって生成された管理コードからスローされます。 C# とVisual Basicコンパイラでは、非CLS準拠の例外 がスローされ、Visual Basicは非CLS準拠の 例外をキャッチしません。 catchブロックの目的がすべて の例外を処理する場合は、次の一般的なcatchブロック構文を使用します。

のC#:キャッチ{}

CA2102: Catch non-CLSCompliant exceptions in general handlers

+0

管理されたC++で発生した例外は、RuntimeWrappedException(SEHExceptionではない)でラップする必要があります。 – LmTinyToon

+0

ネイティブコードは決して管理対象例外をスローしません。天国はそれが起こることを禁じます*起こります。幸運にも、CLRはCSE(破損した状態の例外)のように扱う可能性が高いので、決して捕まえません。 –

+0

@HansPassantあなたのコメントが私に書かれているかどうかは分かりませんが、あなたのコンテンツからは私はそれがopと思われると思います。この記事はおそらくこの記事を読んでいます:https://msdn.microsoft.com/en-us/library/ms404228aspxとそのために、彼はRuntimeWrappedExceptionについて言及しています – mybirthname

関連する問題