Как получить код ошибки исключения в C#

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

когда я вызываю вышеуказанный метод WMI, я должен получить отказ в доступе. В моем блоке catch я хочу убедиться, что исключения действительно отказано в доступе. Есть ли способ получить код ошибки для него ? Win32 код ошибки для Acceess Denied - 5. Я не хочу искать сообщение об ошибке для запрещенной строки или что-то в этом роде.

спасибо

5 ответов


попробуйте это, чтобы проверить исключение и внутренний для Win32Exception исключение производных.

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   
}

как и в комментариях, вам действительно нужно увидеть, какое исключение на самом деле бросается, чтобы понять, что вы можете сделать, и в этом случае конкретный улов предпочтительнее, чем просто поймать исключение. Что-то вроде:

  catch (BlahBlahException ex){  
      // do stuff   
  }

и


вы должны посмотреть на членов брошенного исключения, особенно .Message и .InnerException.

Я также хотел бы посмотреть, сообщает ли документация для InvokeMethod, создает ли он более специализированный класс исключений, чем исключение, например Win32Exception, предложенное @Preet. Ловить и просто смотреть на базовый класс исключений может быть не особенно полезно.


Я предлагаю вам использовать Message Properte из объекта исключения, как показано ниже code

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
}

основываясь на решении Preet Sangha, следующее должно безопасно охватывать сценарий, в котором вы работаете с большим решением с потенциалом для нескольких внутренних исключений.

 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;
}

этот код был протестирован.

Я не буду слишком много говорить о необходимости оценивать и внедрять хорошую практику, когда дело доходит до обработки исключений, управляя каждым ожидаемым типом исключения в своих собственных блоки.


другим методом было бы получить код ошибки непосредственно из класса исключений. Например:

catch (Exception ex)
{
    if (ex.InnerException is ServiceResponseException)
       {
        ServiceResponseException srex = ex.InnerException as ServiceResponseException;
        string ErrorCode = srex.ErrorCode.ToString();
       }
}