Как получить код ошибки исключения в C # - PullRequest
17 голосов
/ 01 августа 2011
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. Я не хочу искать в сообщении об ошибке запрещенную строку или что-то подобное.

Спасибо

Ответы [ 5 ]

34 голосов
/ 01 августа 2011

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

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

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

Однако он доступен только с версии .net 4.5 и выше.

4 голосов
/ 01 августа 2011

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

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

3 голосов
/ 01 февраля 2017

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

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

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

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

1 голос
/ 30 января 2015

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

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
}
0 голосов
/ 03 апреля 2017

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

catch (Exception ex)
{
    if (ex.InnerException is ServiceResponseException)
       {
        ServiceResponseException srex = ex.InnerException as ServiceResponseException;
        string ErrorCode = srex.ErrorCode.ToString();
       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...