如何在c#中获得异常错误码

本文关键字:异常 错误 误码 | 更新日期: 2023-09-27 18:04:10

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

当我调用上面的WMI方法时,我预计会得到Access Denied。在我的catch块中,我想确保引发的异常确实是针对拒绝访问。有什么方法可以让我得到错误代码吗?拒绝访问的Win32错误码为5。我不想在错误信息中搜索被拒绝的字符串或类似的东西。

谢谢

如何在c#中获得异常错误码

你可以用它来检查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   
}

从c# 6开始,可以在catch语句中使用when来指定一个条件,该条件必须为真,才能使处理程序执行特定的异常。

catch (Win32Exception ex) when (ex.InnerException is Win32Exception) {
    var w32ex = (Win32Exception)ex.InnerException;
    var code =  w32ex.ErrorCode;
}

就像在注释中一样,您确实需要查看实际抛出的异常,以了解您可以做什么,以及在哪种情况下,特定的捕获比仅仅捕获异常更可取。比如:

  catch (BlahBlahException ex) {  
      // do stuff   
  }

系统。异常有一个HRESULT

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

但是,它只在。net 4.5以上版本中可用。

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

此代码已经过单元测试。

我不会喋喋不休地谈论通过在各自的块中管理每个预期的异常类型来欣赏和实现异常处理的良好实践的必要性。

您应该查看抛出异常的成员,特别是.Message.InnerException

我还想看看InvokeMethod的文档是否告诉你它是否会抛出一些比Exception更特殊的异常类——比如@Preet建议的Win32Exception。捕获并仅仅查看Exception基类可能不是特别有用。

我建议您使用异常对象的消息属性,如下面的代码

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
}

另一种方法是直接从异常类中获取错误代码。例如:

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

catch (Exception){如果(e是mycustomexception myEx){var errorCode = myEx.ErrorCode;}}