按异常指示错误

对于传统 C 程序员,错误通常通过返回值返回,或返回错误代码的特殊 [out] 参数。 这会导致实现以下方式的接口:

long sample(...)
{
    ...
    p = new Cbar(...);
    if (p == NULL)
    {
        // cleanup
        ...
        return ERROR_OUTOFMEMORY;
    }
}

此方法的问题是,RPC 返回值只是长整数。 它们没有特殊含义(请注意,error_status_t 服务器端没有特殊语义),这具有重要的意义。

首先,RPC 不会通知作失败;它试图取消所有 [in, out] 和 [out] 参数的破坏。 上下文句柄的失败语义也不同。 返回到客户端的数据包本质上是成功的数据包,错误代码深埋在数据包中。 这也意味着 RPC 不使用扩展的错误信息,因此客户端软件通常无法识别调用失败的位置。

通过引发结构化异常处理(SEH)异常(而不是C++)来指示 RPC 服务器例程中的错误是一种更好的方法。 引发 SEH 异常时,控件将直接转到 RPC 运行时。 错误有时发生在无法正确清理的例程中,并且需要向调用方指示错误。 例程应将错误返回到其调用方,而调用方又可将错误返回给调用方,依此返回错误。 但是,堆栈上的最后一个服务器例程应在返回 RPC 之前引发异常,以指示 RPC 发生错误。

异常处理