Подтвердить что ты не робот

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

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

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

Спасибо

4b9b3361

Ответ 1

попробуйте это, чтобы проверить исключение и внутреннее для исключения 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   
}

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

  catch (BlahBlahException ex){  
      // do stuff   
  }

Также System.Exception имеет HRESULT

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

Ответ 2

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

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

Ответ 3

Я предлагаю вам использовать Message 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
}

Ответ 4

Основываясь на решении 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;
}

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

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

Ответ 5

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

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