C# 捕获特定于COMException的错误代码
我希望有人能帮助我。我从COM中得到了一个特殊的异常,我需要捕获它,然后尝试做其他的事情,所有其他的都应该被忽略。除此之外,我的错误消息是: System.Runtime.InteropServices.COMException (0x800A03EC):Microsoft Office Excel 无法访问文件“C:\test.xls”。 有几个可能的原因: 所以我最初的尝试是C# 捕获特定于COMException的错误代码,c#,com,C#,Com,我希望有人能帮助我。我从COM中得到了一个特殊的异常,我需要捕获它,然后尝试做其他的事情,所有其他的都应该被忽略。除此之外,我的错误消息是: System.Runtime.InteropServices.COMException (0x800A03EC):Microsoft Office Excel 无法访问文件“C:\test.xls”。 有几个可能的原因: 所以我最初的尝试是 try { // something } catch (COMException ce) { if (ce.
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获取错误代码
提前感谢。错误代码应为无符号整数;您可以按如下方式执行比较:
try {
// something
} catch (COMException ce) {
if ((uint)ce.ErrorCode == 0x800A03EC) {
// try something else
}
}
实际上,我设法让它在我需要的系统上运行,发现错误代码是-2146807284
看看这个,如果我将0x800A03EC转换为二进制,然后将其视为2的补充,那么您可以计算该值。HRESULT值有32位,分为三个字段:严重性代码、设备代码和错误代码。严重性代码指示返回值是表示信息、警告还是错误。设备代码确定了导致错误的系统区域。错误代码是一个分配用于表示异常的唯一编号。每个异常都映射到一个不同的HRESULT。 摘录自: 根据我收集的信息,HRESULT位的前半部分可能会根据导致异常的系统/进程而变化。第二部分包含错误类型 代码应该如下所示:
try {
// something
} catch (COMException ce) {
if ((uint)ce.ErrorCode & 0x0000FFFF == 0x800A03EC) {
// try something else
}
}
注意:请记住我不是.NET用户,所以请对上述代码中的语法错误感到厌倦。只需添加一个注意事项。复制这个异常并不容易,因为我需要一个非常具体的配置来完成,我正在努力,但我认为在这里询问可能会更快:)是的,另一种方法是将HRESULT转换为有符号整数,但可能保留十六进制代码会使它更具可读性(并且更易于谷歌搜索).1:谢谢你的详细分类。这是很久以前的东西,但对任何感兴趣的人都很有用。
&0x0000FFFF
的作用是什么?它将“删除”(设置为0)uint的左半部分,因此它永远不会是==0x800A03EC
,对吗?因此,从C代码中,无法执行类似的操作,使用winerrorsorwhere
,然后如果((uint)ce.ErrorCode==E\u UNEXPECTED\u或\u where)
,则上述操作有效,但仅当在未选中的上下文中编译时。否则,负的ce.ErrorCode
将不会愉快地转换为正的uint
。实际上,转换=
符号的另一面,并说如果(ce.ErrorCode==unchecked((int)0x800A03EC)){…}
会更好。看,这是一个框架错误吗?Exception.HResult应该被定义为uint吗?@Tristan:我认为它是这样声明的,因为未签名的类型不符合CLS。上面评论的更新的工作链接: