C++ DLL を作成し、C# アプリケーションで使用しています。エラーはどのように報告すればよいですか?
例外とthrow
エラーを使用するか、std::cout や std::cerr などに出力しますか? DLL 内で例外を発行した場合、C# アプリケーションは例外をキャッチできますか?
この点で最善の行動方針は何ですか?
3 に答える
以下は、PInvoke を使用して をスローするメソッドを呼び出す C# からの出力例std::exception
です。
ex = System.Runtime.InteropServices.SEHException (0x80004005):
External component has thrown an exception.
at ConsoleTester.Program.throw_exception()
at ConsoleTester.Program.Main(String[] args) in ConsoleTester.cs:line 18
注: この場合、 throw_exception() は公開されたネイティブ メソッドであり、サブメソッドを呼び出しましたが、スタック トレースのその部分を確認することはできません。最も深いスタック フレームで得られるのは、ネイティブ境界だけです。
したがって、完璧ではありませんが、機能します。エラー コードを返すことは、おそらくこれを処理する最も標準的な方法ですが、ライブラリの唯一の消費者である場合は、おそらく大きな違いはありません。
注: stdin/stdout は、通常、エラーを処理するための最悪の方法です。例外は、何か問題が発生したときにアプリケーション内のすべてがアクセスできるカスタム エラー処理オブジェクトまたは一連のルーチンを作成することはそれほど悪くないということです。(このようなインターフェースからの出力は、stdin/stdout またはファイルなど、構成されていると便利なものである場合があります) ここで log4j または log4net を考えてください...
通常、ロギングはエラー処理の一部にすぎません。不利な状況に対応し、(できれば) それらから回復するように、アプリケーションの他の部分に信号を送る必要があります。ここでは、エラー コードまたは例外のみが実際にうまく機能します (いずれにせよ、例外はメイン プログラム フローから最小限に抑える必要があります)。