基于这个SO答案:Catching COMException specific Error Code,我想知道,如果我只需要查看异常的特定部分,就可以在OS和多个版本的OL中正确处理COMExceptions。例如,
private const uint HRESULT_OPERATIONABORTED = 0x80004004;
// ...
try {
// something that could throw COMExceptions
} catch (System.Runtime.InteropServices.COMException e) {
switch ((uint)e.ErrorCode) {
case HRESULT_OPERATIONABORTED:
break;
default:
break;
}
}
这是否足够跨平台,或者只考虑错误代码的一部分?
编辑 - 为了澄清,我的确切问题是,(uint)e.ErrorCode
与0x80004004
的比较是否过于具体(也就是说,我总是获取{{ 1}}对于这个特定的错误,无论OS / OL如何),或者这是否是正确的做事方式。
答案 0 :(得分:0)
您可能还想考虑捕获System.OutOfMemoryException和其他异常,这些异常是从COM对象返回的HRESULT的结果。并非所有失败的HRESULT都会导致COMException。
对于我见过的大多数MAPI错误,错误代码与标准C MAPI头文件中声明的错误代码不同,所以我认为switch语句没问题。换句话说,该方法不应该与C编写的MAPI客户端应用程序兼容。
答案 1 :(得分:0)
就跨平台竞争而言,你几乎不用担心,COM只能在Windows上运行。类似地,错误代码是一个定义良好的代码。您可以在WinError.h SDK头文件中查找标准COM错误代码。这是E_ABORT。我建议你实际使用那个标识符。
你会在c:\ program files \ microsoft sdks \ windows \ v6.0 \ include中找到这个标题。 VS2010是v7.0。