System.Runtime.InteropServices.COMException 类

本文提供了此 API 参考文档的补充说明。

COMException 是当从 COM 方法调用返回无法识别的 HRESULT 时所引发的异常。

公共语言运行时将已知的 HRESULT 转换为 .NET 异常,使 COM 对象能够将有意义的错误信息返回到托管客户端。 HRESULT 到异常的映射还可以反向工作,即将特定的 HRESULT 返回到非托管客户端。 有关映射详细信息,请参阅 如何映射 HRESULT 和异常

当运行时遇到不熟悉的 HRESULT(缺少特定、相应的异常的 HRESULT)时,它会引发 COMException 类的一个实例。 此通用异常与任何异常公开相同的成员,并继承一个公共 ErrorCode 属性,该属性包含被调用方返回的 HRESULT。 如果运行时可以使用错误消息(从 Visual Basic 中的 IErrorInfo 接口或 Err 对象获取,或者在某些情况下从作系统获取),则会将消息返回到调用方。 但是,如果 COM 组件开发人员未能包含错误消息,运行时将返回八位 HRESULT 代替消息字符串。 使用 HRESULT,调用方可以确定泛型异常的原因。

处理 COMException 异常

以下是对处理 COMException 异常时的一些注意事项。

ErrorCode属性检查:当运行时遇到不熟悉的 HRESULT 并引发COMException异常时,该ErrorCode属性将包含错误消息,或者在错误消息不可用的情况下,提供八位的 HRESULT 值。 错误消息或 HRESULT 值可以帮助你确定异常的原因。

有关 HRESULT 值的列表,请参阅 常见 HRESULT 值

将后期绑定参数传递给 Microsoft Office 对象的方法时,如果这些对象是 COM 对象,可能会引发 COMException 异常。 后期联编程序假定:此类方法调用涉及 ByRef 参数,并且所传递的属性具有 set 访问器。 如果该属性不存在,.NET 将生成一个异常 MissingMethodException (包含 CORE_E_MISSINGMETHOD HRESULT)。 若要解决此问题,请使用早期绑定的对象或传递变量而不是对象的属性。

COM 用于在 Visual Studio 与 托管进程之间进行通信。 由于它在代码运行之前使用,因此对 CoInitializeSecurity 的调用会导致引发此异常。 在某些情况下,以管理员身份运行 Visual Studio 可能会解决此问题。 还可以 禁用托管进程

引发 COMException 异常

尽管您可以使用 COMException 类将特定的 HRESULT 返回给非托管客户端,但引发特定的 .NET 异常要优于使用一般异常。 请注意,托管客户端和非托管客户端都可以使用您的 .NET 对象。对于托管调用方来说,抛出HRESULT(错误代码)比抛出异常更难理解。