我希望有人可以帮助我。我有一个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获取错误代码?
提前致谢。
答案 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的恭维,那么你可以计算该值。