2

IO操作で、一般的なIOExceptionがスローされることがあります。特定のエラー コードを特定するために、Marshal.GetHRForException(Exception e)メソッド (ここにあります)を使用できます。その後、アプリケーション固有のエラー コードを使用して例外を再スローし、ユーザーに問題のヒントを提供したいと考えています。しかし、 IOExceptionの可能なHResult値のリストを見つけることができませんでした。

私が立ち往生しているもう1つのことは、さまざまなHResultコードの根本原因が同じである可能性があることです-たとえば、0x8007052E0x80070569-両方に対応しますLogon failure: unknown user name or bad password.

「IOException HResult値」のようなものを検索しようとしましたが、IOException HResultを人間が読めるエラー(thisまたはthisなど)にマッピングするための特別なことは何もありませんでした。

こちらの質問も見ましたが、これは非常に似ていますが、まだ解決策はありません。

では、IOException HResults 値に関するドキュメントはどこにありますか?

4

1 に答える 1

9

Marshal.GetHRForException() を使用して、Windows エラー コードを HResult エラー コードにラップしました。IOException の場合、常に Windows エラー番号 + 0x80070000 になります。「8」はエラーを意味し、「7」は Windows から来たことを意味します。& 0xffff元のエラー コードを再度回復するために使用できます。

結果を 10 進数に戻すと、エラー コードの意味を調べる場所がたくさんあります。個人的には、常に WinError.h SDK ヘッダー ファイルを使用しています。使用している VS のバージョンによって異なりますが、ほとんどのプログラマーは C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include ディレクトリに戻ってきます。

Visual Studio コマンド プロンプトから errlook.exe を実行する便利なユーティリティも利用できます。すぐに利用できるようにする良い方法は、[ツール] メニューに追加することです。ツール + 外部ツール、追加ボタン、タイトル = "エラー ルックアップ"、"コマンド" = C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\errlook.exe を使用します。VS のバージョンに合わせて、必要に応じてパスを微調整します。

また、エラー コードが同じではないこともわかります。0x80070569 & 0xffff = 0x569 = 1385. WinError.h でそのエラー コードを検索すると、ERROR_LOGON_TYPE_NOT_GRANTED が生成されます。

取得できる IOException エラーの種類は制限されていません。Windows には「例外仕様」がありません。特定の winapi 関数の MSDN ドキュメントには、最も一般的なエラー コードのみがリストされています。.NET の例外によく似ています。必要悪、多くの IOException エラー コードは、Microsoft によって作成されていないドライバーによって生成されます。

于 2014-09-09T08:57:15.433 に答える