Как получить код ошибки исключения в С#
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.
Я не хочу искать сообщение об ошибке для запрещенной строки или что-то в этом роде.
Спасибо
Ответы
Ответ 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();
}
}