按异常指示错误
对于传统的 C 程序员,错误通常通过返回值或返回错误代码的特殊 [out] 参数返回。 这会导致接口按以下方式实现:
long sample(...)
{
...
p = new Cbar(...);
if (p == NULL)
{
// cleanup
...
return ERROR_OUTOFMEMORY;
}
}
此方法的问题在于 RPC 返回值只是长整数。 它们没有特殊意义,因为错误 (注意 error_status_t 在服务器端) 上没有特殊语义,这具有重要的意义。
首先,不会向 RPC 发出操作失败的警报;它尝试取消所有 [in, out] 和 [out] 参数的分配。 上下文句柄的失败语义也不同。 返回到客户端的数据包实质上是成功的数据包,错误代码深埋在数据包中。 这也意味着 RPC 不使用扩展的错误信息,因此客户端软件通常无法识别调用失败的位置。
通过引发结构化异常处理 (SEH) 异常来指示 RPC 服务器例程中的错误 (而不是 C++) 是更好的方法。 引发 SEH 异常时,控制将直接转到 RPC 运行时。 错误有时发生在无法正确清理的例程中,需要向调用方指示错误。 例程应将错误返回给其调用方,而后者又可以将错误返回给其调用方等。 但是,堆栈上的最后一个服务器例程在返回到 RPC 之前应引发异常,以向 RPC 指示发生了错误。
相关主题