ExceptionのHResultについて

C#でファイル操作などのWindowsに関わる操作を行うと内部的にはWindows APIが呼ばれます。
WindowsAPIはC#ではないので、エラーになったときにはC++的な形でエラーコードを返します。
それをC#でラッピングしてあるので、C#でExceptionとしてエラーを取得する事ができます。

C#のExceptionのメッセージだと大まかな分け方しかしていないので詳細に知りたい場合はHResultの値を調べます。

try{ 
}catch(Exception e ){
  e.HResult // <- こいつについての話
}

例えばファイルを置換に失敗した場合 IOException になります。

try{
  System.IO.File.Replace(sourceFileName, destFileName, null);
}catch( IOException e ){
  //  e.Message → 置換されるファイルを削除できません。
  //  e.HResult → -2147023721
}

int型の表示でマイナスの値が表示されますが、所詮ビットデータなので2進数表示で確認します。
f:id:kitunechan:20181204143437p:plain

更に上位下位として半分ずつにします。

2進数:1000000000000111 0000010010010111
16進数:0x8007 0x0497

で、これがなんなんだっていうと 上位の0x8007はWin32エラーコードということを示しています。
下位の0x0497がエラーの番号です。

ERROR_UNABLE_TO_REMOVE_REPLACED 1175 (0x497)
置換されたファイルを削除できませんでした。置換されるファイルと置換ファイルの名前は、元のまま変更されていません。

ReplaceFileA function | Microsoft Docs

こんな感じでWindows APIのエラーコードにたどり着くことができます。


参考:
ASCII.jp:Windowsで表示されるエラーコードの見方|Windows Info