Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 捕获特定于COMException的错误代码_C#_Com - Fatal编程技术网

C# 捕获特定于COMException的错误代码

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.

我希望有人能帮助我。我从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获取错误代码


提前感谢。

错误代码应为无符号整数;您可以按如下方式执行比较:

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。上面评论的更新的工作链接: