COM+ 中的错误处理策略
本主题确定在开发 COM+ 组件时要记住的多个错误处理策略。
返回所有组件接口中所有方法的 HRESULT 值。 COM+ 使用 HRESULT 值报告在进行函数调用或接口方法调用时出现的任何错误。 HRESULT 指示方法是成功还是失败,并标识与错误关联的错误,例如 RPC、WIN32 或 ITF 表示特定于接口的错误。 此外,系统 API 提供从 HRESULT 到描述错误条件的字符串的查找。 使用返回 HRESULT 值的方法对于编写良好的组件至关重要,对调试过程至关重要。 Microsoft Visual Basic 会自动使用 HRESULT 作为返回来定义每个方法。 在 Microsoft Visual C++ 中,必须显式返回 HRESULT。 有关 HRESULT 的其他信息,请参阅 COM 错误代码的结构。
通过开发工具提供的任何方式启动 ErrorInfo 集合对象。ErrorInfo 集合对象通常称为 COM 异常,因为它们允许对象将丰富的错误信息传递(或抛出)给其调用方,甚至跨越单元边界。 此通用错误对象的值是 HRESULT 的补充,从而扩展了可以返回给调用方的错误信息类型。 每个 ErrorInfo 集合对象都会返回发起错误的方法的上下文描述、错误源和接口标识符。 还可以在帮助文件中包括指向条目的指针。 自动化提供三个用于管理错误对象的接口。 组件必须实现 ISupportErrorInfo 自动化接口才能播发对 ErrorInfo 集合的支持。 发生错误时,组件会使用 ICreateErrorInfo 自动化接口初始化错误对象。 调用方检查 HRESULT 并发现方法调用失败后,会查询对象以查看是否支持 ErrorInfo 集合。 如果支持,调用方将使用 IErrorInfo 自动化接口检索错误信息。 Visual Basic 程序员可以轻松访问 ErrorInfo 集合对象,该对象是通过 Err 对象公开的。 可以使用 Err Raise 函数引发错误,并使用 On Error 语句捕获错误。 Visual Basic 运行时层负责处理映射。 如果使用的是 Visual C++ COM 编译器支持,则可以使用 _com_raise_error 类报告错误,并使用 _com_error 类来检索错误信息。 COM+ 不会将传统的 C++ 异常传播为扩展 IErrorInfo 信息。 有关 ErrorInfo 集合对象的其他信息,请参阅自动化指南中的“错误处理”。
注意
COM 要求所有 ErrorInfo 集合对象按值封送,这意味着实现 IErrorInfo 自动化接口的组件也必须实现和支持 IMarshal 接口。 IMarshal 接口实现必须支持按组件值封送。
使用事务管理共享资源故障。 自动事务可显著减少使用状态托管资源管理器时必须编写的错误处理代码量。 但是,事务不会完全消除错误处理需求。 仍然需要从接口方法返回错误代码,并检查调用方中的这些错误代码,以避免对注定的事务执行不必要的工作。 有关将错误处理与事务处理相结合的其他信息,请参阅通过通知根对象加快事务速度。
显式引发错误。 除非对象显式引发错误,否则避免让错误信息离开对象。 捕获所有工具生成的错误,并在组件代码中处理它们。 至少,包括一个标准处理程序,以一致的方式报告意外错误。
使用 FACILITY_ITF 错误范围报告接口特定的错误。 接口特定的错误应位于 0x0200 和 0xFFFF 之间的 FACILITY_ITF 错误范围内。 可以在 Visual Basic 中将自定义错误代码定义为 vbObjectError 的偏移量。 使用 C++ 中的 MAKE_HRESULT 宏引入特定于接口的错误代码,如以下示例所示:
const HRESULT ERROR_NUMBER = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 10);
相关主题