最近、Win32 APIとの相互運用を含む多くのコードを書いており、Windows API関数の呼び出しによって引き起こされるネイティブ(アンマネージド)エラーを処理する最善の方法を知り始めました。Win32Exceptionをスローする
現在、ネイティブ関数への呼び出しは次のようになり:
は例外を発生させ回線が同等なように書き換えることができる
// NativeFunction returns true when successful and false when an error
// occurred. When an error occurs, the MSDN docs usually tell you that the
// error code can be discovered by calling GetLastError (as long as the
// SetLastError flag has been set in the DllImport attribute).
// Marshal.GetLastWin32Error is the equivalent managed function, it seems.
if (!WinApi.NativeFunction(param1, param2, param3))
throw new Win32Exception();
は、私は信じている:今
throw new Win32Exception(Marshal.GetLastWin32Error());
が、これがすべてですよく設定されているWin32エラーコードと例外オブジェクトのプロパティとして人間が判読可能な(一般的な)説明を適切に含む例外がスローされます。しかし、私は、これらの例外のすべてではないにしても、少なくともいくつかを修正/ラップすることが推奨されています。つまり、コンテキスト指向のエラーメッセージが多少出ます。つまり、ネイティブコードがどんな状況であっても意味があります。使用されています。
Win32Exception
のコンストラクタでカスタムエラーメッセージを指定
:私はこのためにいくつかの選択肢を検討しています。
throw new Win32Exception(Marshal.GetLastWin32Error(), "My custom error message.");
元のエラーコードとメッセージの両方が保持されるように(
Win32Exception
は現在親例外のInnerException
である)別の例外オブジェクトにWin32Exception
ラッピング。throw new Exception("My custom error message.", Win32Exception(Marshal.GetLastWin32Error()));
ラッパー例外として別の
Win32Exception
を用いる以外は2と同じ。Exception
から派生したカスタムクラスをラッパー例外として使用する点を除いて、2と同じです。2と同じですが、例外として、BCL(基本クラスライブラリ)例外を親として使用する点が異なります。この場合、
InnerException
をWin32Exception
に設定するのが適切かどうかは不明です(おそらく、低レベルのラッパーではありますが、Win32の相互運用機能がバックグラウンドで行われていることを明らかにしていない高水準/抽象インターフェースではありません)。
本質的に私が知りたいのは、.NETのWin32エラーに対処するために推奨されるプラクティスは何ですか?私はそれをオープンソースコードでさまざまな方法で行っていますが、設計上のガイドラインがあるかどうかは不思議でした。そうでない場合、私はここであなたの個人的な好みに興味を持っています。 (おそらく、あなたは上記の方法のどれも使用しないでしょうか?)
+1その他の情報 - 「ファイルが見つかりません」という例外が表示されない場合は、ファイルが見つからないという例外が表示されます。 –
@Earwicker:あなたは公正なポイントを作っています...また、Harperが指摘しているように、頻繁に(必ずしもそうではありませんが)むしろあいまいで役に立たない傾向があるため、Win32Exceptionとの関連でこの質問をしています。 – Noldorin
最後の段落を明確にするために、内側のエラーメッセージ*を内側の例外としてラップするのが最善であることを意味しますか? – Noldorin