none
C#获取错误代码的问题 RRS feed

  • 问题

  • 现在在做个程序,是和wmi对象的通信。在执行 ManagementObject.InvokeMethod(wmiMethodName) 方法时,wmiMethodName方法本身很可能引发异常,但是调试的时候异常文本是空,所有希望可以获取到此方法抛出的错误代码。在vb.net中可以直接地使用err.number来获取wmiMethodName的错误代码,但是c#里没有~怎么办?不知道ManagementObject.InvokeMethod()引发的异常具体是什么类型的。


    同心同德同舟楫,济人济事济天下。
    2010年7月18日 0:58

答案

  • 方法似乎不行,不过现在问题已经基本解决了,还是谢谢。。。 这个方法会引发COMException,获取此异常的ErrorNumber属性就行了~不过似乎有个bug,ErrorNumber返回的是负数!后来我估计是因为二进制的HRESULT错误代码最高位是1,在转换为十进制的时候,编译器认为最高位是符号位,转换之后,就变成负数了o(╯□╰)o。如果把看它的二进制表示,结果就对了。
    同心同德同舟楫,济人济事济天下。
    2010年7月18日 12:12
  • 这个不是 Bug。By Design 的。因为 .NET 中的 COMException.ErrorNumber 类型是 int32,也就是 32 位有符号整数,把它转成 UInt32 结果就对了。

    如果要得到关于这个 HRESULT 的错误信息,可以使用 Marshal.GetExceptionForHR(Int32) 方法。


    Mark Zhou
    2010年7月19日 9:06

全部回复

  • 可以尝试调用Windows API GetLastError 获取错误代码。
    2010年7月18日 8:14
  • 方法似乎不行,不过现在问题已经基本解决了,还是谢谢。。。 这个方法会引发COMException,获取此异常的ErrorNumber属性就行了~不过似乎有个bug,ErrorNumber返回的是负数!后来我估计是因为二进制的HRESULT错误代码最高位是1,在转换为十进制的时候,编译器认为最高位是符号位,转换之后,就变成负数了o(╯□╰)o。如果把看它的二进制表示,结果就对了。
    同心同德同舟楫,济人济事济天下。
    2010年7月18日 12:12
  • 这个不是 Bug。By Design 的。因为 .NET 中的 COMException.ErrorNumber 类型是 int32,也就是 32 位有符号整数,把它转成 UInt32 结果就对了。

    如果要得到关于这个 HRESULT 的错误信息,可以使用 Marshal.GetExceptionForHR(Int32) 方法。


    Mark Zhou
    2010年7月19日 9:06