Как получить код ошибки исключения в 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();
}
}