捕获COMException特定的错误代码

时间:2009-09-15 09:32:17

标签: c# com

我希望有人可以帮助我。我有一个COM需要捕获的特定异常,然后尝试做其他事情,其他所有都应该被忽略。我的错误消息是:

  

System.Runtime.InteropServices.COMException   (0x800A03EC):Microsoft Office Excel   无法访问文件'C:\ test.xls'。   有几个可能的原因:

所以我最初的尝试是

try
{
 // something
}
catch (COMException ce)
{
   if (ce.ErrorCode == 0x800A03EC)
   {
      // try something else 
   }
}

然而,我读了一个编译器警告:

  

警告22与积分比较   常数是无用的;常数是   超出范围的类型   'int'..... ExcelReader.cs 629 21

现在我知道0x800A03EC就是 HResult和我刚看过MSDN 并阅读:

  

HRESULT是一个32位的值,   分为三个不同的领域:a   严重性代码,设施代码和   错误代码。严重性代码   表示是否返回值   代表信息,警告或   错误。设施代码识别   系统负责的区域   错误。

所以我的最终问题是,我如何确保捕获该特定异常?或者我如何从HResult获取错误代码?

提前致谢。

3 个答案:

答案 0 :(得分:38)

ErrorCode应该是无符号整数;你可以按如下方式进行比较:

try {
    // something
} catch (COMException ce) {
    if ((uint)ce.ErrorCode == 0x800A03EC) {
        // try something else 
    }
}

答案 1 :(得分:10)

HRESULT值有32位,分为三个字段:严重性代码,设施代码和错误代码。严重性代码指示返回值是表示信息,警告还是错误。 设施代码标识负责该错误的系统区域。 错误代码是分配用于表示异常的唯一编号。每个异常都映射到不同的HRESULT。 摘自:http://en.wikipedia.org/wiki/HRESULT

从我收集的内容来看,HRESULT位的前半部分可能会根据导致异常的系统/进程而改变。后半部分包含错误类型。

代码应如下所示:

try {
    // something
} catch (COMException ce) {
    if ((uint)ce.ErrorCode & 0x0000FFFF == 0x800A03EC) {
        // try something else 
    }
}

注意:请记住,我不是.NET人员,因此请注意上述代码中的语法错误。

答案 2 :(得分:0)

我实际设法让它在我需要的系统上运行,发现错误代码是-2146807284。

看一下,如果我将0x800A03EC转换为二进制,然后将其视为2的恭维,那么你可以计算该值。