捕获COMException特定的错误代码

Ian*_*Ian 25 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 
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

现在我知道0x800A03EC是HResult,我刚看了MSDN并阅读:

HRESULT是一个32位值,分为三个不同的字段:严重性代码,设施代码和错误代码.严重性代码指示返回值是表示信息,警告还是错误.设施代码标识负责该错误的系统区域.

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

提前致谢.

Pao*_*sco 38

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

try {
    // something
} catch (COMException ce) {
    if ((uint)ce.ErrorCode == 0x800A03EC) {
        // try something else 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 上面的工作,但只有在`unchecked`上下文编译时.否则,否定的`ce.ErrorCode`将不会愉快地转换为正的`uint`.转换`=='符号的另一面实际上更好,并说`if(ce.ErrorCode == unchecked((int)0x800A03EC)){...}`.请参阅[MSDN上的示例](http://msdn.microsoft.com/en-us/library/system.exception.hresult.aspx). (15认同)

Sco*_*bie 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 
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:请记住我不是.NET的人,所以在上面的代码中厌倦了语法错误.

  • 什么是`&0x0000FFFF`?它将'删除'(设置为0)uint的左半部分,因此它永远不会是`== 0x800A03EC`,对吧? (9认同)