2011-08-01 2 views
13
try 
{ 
    object result = processClass.InvokeMethod("Create", methodArgs); 
} 
catch (Exception e) 
{ 
    // Here I was hoping to get an error code. 
} 

私は上記のWMIメソッドを呼び出すと、アクセスが拒否されると予想されます。私のcatchブロックでは、例外が実際にアクセス拒否であることを確認したいと思います。私はそれのためのエラーコードを得ることができる方法はありますか? Acceess DeniedのWin32エラーコードは5です。 拒否された文字列などのエラーメッセージを検索したくありません。C#で例外エラーコードを取得する方法

おかげ

+1

は、コードを実行し、あなたのcatchブロックにブレークポイントを置いて、例外を見て、あなたが持っているどのような情報を見るためにデバッガを使用しています。 –

+0

また、GetType()を使用して例外の種類をデバッグして出力することなく、コードを実行することもできます。しかし、ジョエルの答えは確かにトリックを行うだろう。 – KyleM

+0

予期しない例外の正確なタイプをキャッチするだけです。 'Exception'をキャッチすることは、ほとんど常に悪いコードのにおいです。 – Bevan

答えて

26

例外をチェックするために、これを試してみて、コメントのようにWin32Exception derived exception.

catch (Exception e){ 
    var w32ex = e as Win32Exception; 
    if(w32ex == null) { 
     w32ex = e.InnerException as Win32Exception; 
    }  
    if(w32ex != null) { 
     int code = w32ex.ErrorCode; 
     // do stuff 
    }  
    // do other stuff 
} 

用インナー一つは、あなたが本当に何をすることができます理解するために、実際にスローされているものを除い確認する必要がありますそういう場合には、Exceptionをキャッチするだけで特定のキャッチが優先されます。ような何か:

catch (BlahBlahException ex){ 
     // do stuff 
    } 

またSystem.Exception has a HRESULT

catch (Exception ex){ 
    int code = ex.HResult; 
} 
+0

この質問はちょっと古いので、これはこの回答を使用したい人のためのものです: .NET 3.0,5.5および4.0の場合は、HResultプロパティの値を取得するためにリフレクションを使用する必要があります保護された。 出典:http://stackoverflow.com/questions/15462675/how-can-i-get-the-error-number-instead-of-error-message-in-an-exception-in-c – curiousBoy

4

あなたが特に.Message.InnerException、スローされた例外のメンバーになっているはずです。

また、InvokeMethodのドキュメントで、例外よりも特殊化されたExceptionクラス(@Preetで提案されたWin32Exceptionなど)をスローするかどうかがわかります。 Exceptionの基底クラスをキャッチして見ているだけでは、特に有用ではないかもしれません。

1

は、私はあなたのコードの下のように例外オブジェクトからのメッセージProperteを使用することをお勧め

try 
{ 
object result = processClass.InvokeMethod("Create", methodArgs); 
} 
catch (Exception e) 
{ 
    //use Console.Write(e.Message); from Console Application 
    //and use MessageBox.Show(e.Message); from WindowsForm and WPF Application 
} 
1

ビルプリートサンガのソリューションで、安全にあなたが可能性を持つ大規模なソリューションで作業しているシナリオをカバーする必要があり、次のいくつかの内部例外のために。

try 
{ 
    object result = processClass.InvokeMethod("Create", methodArgs); 
} 
catch (Exception e) 
{ 
    // Here I was hoping to get an error code. 
    if (ExceptionContainsErrorCode(e, 10004)) 
    { 
     // Execute desired actions 
    } 
} 

...

private bool ExceptionContainsErrorCode(Exception e, int ErrorCode) 
{ 
    Win32Exception winEx = e as Win32Exception; 
    if (winEx != null && ErrorCode == winEx.ErrorCode) 
     return true; 

    if (e.InnerException != null) 
     return ExceptionContainsErrorCode(e.InnerException, ErrorCode); 

    return false; 
} 

このコードは、ユニットがテストされています。

予期された例外タイプをそれぞれのブロック内で管理することで、例外処理に関して優れたプラクティスを評価し実装する必要性があまりにも高くなりません。

+0

C#6では、最初のif文を一番下の行に変更することができます。最初の部分はnullをチェックし、 'winEx == null'のときはif条件に失敗します。そして、 'ErrorCode'プロパティを安全にチェックし、null例外をスローします。 'if(winEx?.ErrorCode == ErrorCode)' –

0

もう1つの方法は、例外クラスからエラーコードを直接取得することです。たとえば:

catch (Exception ex) 
{ 
    if (ex.InnerException is ServiceResponseException) 
     { 
     ServiceResponseException srex = ex.InnerException as ServiceResponseException; 
     string ErrorCode = srex.ErrorCode.ToString(); 
     } 
} 
関連する問題