错误处理和返回值
VSPackage 和 COM 对错误使用相同的体系结构。 和SetErrorInfo
GetErrorInfo
函数是 Win32 应用程序编程接口(API)的一部分。 集成开发环境(IDE)中的任何 VSPackage 都可以调用这些全局 Win32 API,以在收到错误通知时记录丰富的错误信息。 Visual Studio SDK 提供互操作程序集来管理错误信息。
互操作方法
为了方便起见,IDE 提供了一种方法, SetErrorInfo用于使用 Win32 API,而不是调用 Win32 API。 在托管代码中使用 SetErrorInfo。 当错误 HRESULT
到达应显示错误消息的级别(这通常是实现 IOleCommandTarget 命令处理程序的对象),IDE 使用另一种方法 ReportErrorInfo来显示相应的消息框。 在托管代码中, ReportErrorInfo 使用该方法。
作为 VSPackage 实现者,COM 对象通常实现 ISupportErrorInfo
。 该 ISupportErrorInfo
接口可确保丰富的错误信息可以垂直向上移动调用链。 跨进程或跨线程使用的对象必须支持 ISupportErrorInfo
,以确保将丰富的错误信息正确封送回调用方。
与 VSPackage 相关且涉及扩展 IDE 的所有对象(包括编辑器工厂、编辑器、层次结构和提供的服务)都应支持丰富的错误信息。 虽然 IDE 不需要实现这些 VSPackage 对象 ISupportErrorInfo
,但始终会鼓励它。
IDE 负责报告错误信息,并在将 HRESULT
错误信息传播到 IDE 时将其显示给 Visual Studio 用户。 IDE 也是创建 ErrorInfo
对象的机制。
一般指南
还可以使用 SetErrorInfo 和 ReportErrorInfo 方法设置和报告 VSPackage 实现内部的错误。 但是,作为一般规则,请遵循以下指南来处理 VSPackage 中的错误消息:
在 VSPackage COM 对象中实现
ISupportErrorInfo
。创建一个错误报告机制,用于调用 SetErrorInfo 实现 IOleCommandTarget的对象中的方法。
让 IDE 通过 ReportErrorInfo 该方法向用户显示错误。
IDE 中的错误信息
以下规则指示如何处理 Visual Studio IDE 中的错误信息:
作为一种防御策略,以确保不会向用户报告过时错误信息,调用该方法的 ReportErrorInfo 函数应首先调用该方法 SetErrorInfo 。 传入
null
以清除缓存的错误消息,然后再调用可能设置新错误信息的任何内容。仅允许不直接报告错误消息的函数在返回错误
HRESULT
时调用SetErrorInfo该方法。 允许清除ErrorInfo
函数的条目或返回 S_OK时。 此规则的唯一例外是调用返回接收方可以显式恢复或安全地忽略的错误HRESULT
。任何显式忽略错误的
HRESULT
方都必须 SetErrorInfo 使用 S_OK.. 否则,ErrorInfo
当另一方生成错误而不提供自己的ErrorInfo
错误时,可能会意外使用该对象。鼓励发起错误
HRESULT
的所有方法调用 SetErrorInfo 该方法以提供丰富的错误信息。 如果返回HRESULT
的错误是特殊FACILITY_ITF
错误,则需要该方法才能提供正确的ErrorInfo
对象。 如果返回的错误是标准系统错误(例如,、E_OUTOFMEMORYE_ABORT、E_INVALIDARGE_UNEXPECTED,等等),则返回错误代码是可以接受的,而无需显式调用SetErrorInfo该方法。 作为防御性编码策略,在发起错误HRESULT
(包括系统错误)时,始终调用 SetErrorInfo 方法,以ErrorInfo
更详细地描述失败或null
。返回由另一个调用发起的错误的所有函数都必须传递从失败调用中
HRESULT
接收的信息,而无需修改ErrorInfo
对象。