(RPC) 的错误处理

在同步 RPC 中,客户端进行远程调用,该调用使用成功或失败代码返回。 异步 RPC 为调用失败提供了更多机会,这些失败的处理方式会有所不同,具体取决于故障发生的位置和时间。 下表描述了调用失败的方式以及处理方式。

客户端清理

故障症状 清理
客户端在调用远程过程时捕获异常。 不需要 RPC API 调用。 已清理所有 RPC 状态。
客户端收到调用完成通知,但在调用 RpcAsyncCompleteCall 时,它会收到错误代码。 不需要 RPC API 调用。 已清理所有 RPC 状态。
客户端发出非中止或中止取消。 客户端必须等待通知,并在通知到达时调用 RpcAsyncCompleteCall

 

在服务器端清理中,一个关键概念是移交点。 在服务器端处理异步调用期间,通常在接收调用的线程上执行某些处理 (也称为 调度程序线程) ,然后调度程序线程可以选择性地将足够的状态放入内存块,并发出信号, (也称为 工作线程) 的另一个线程继续处理该调用。 调度程序线程成功发出信号,指示工作线程称为 移交点的时刻。

服务器端清理

遇到错误 清理
在移交点之前。 引发异常。 无需调用 RpcAsyncCompleteCall
交接点后。 调用 RpcAsyncAbortCall ,如果错误不是致命错误并且结果仍可返回到客户端,则调用 RpcAsyncCompleteCall。 如果 RpcAsyncCompleteCall 函数调用失败,RPC 运行时将释放参数。 用户不得访问这些参数。 调度程序线程不得执行在移交点后可能失败的任何实质性处理,因为它不再可以安全地中止调用。 具体而言,它不得在切换点后引发异常,否则服务器可能会崩溃。

 

管道的特殊错误处理案例

使用管道时,错误处理有一些特殊情况。 以下列表说明了失败的源,以及如何处理错误。

故障源 处理方式
客户端调用推送,调用失败。 不需要 RPC API 调用。 已清理所有 RPC 状态。
客户端在排出管道中的 之前调用 RpcAsyncCompleteCall 调用失败,并显示相应的管道填充错误代码。
客户端调用拉取,调用失败。 不需要 RPC API 调用。 已清理所有 RPC 状态。
客户端或服务器以错误的顺序调用推送或拉取。 运行时返回管道填充错误状态。
服务器调用推送或拉取,调用失败。 推送将返回失败代码。 无需调用 RpcAsyncCompleteCall
服务器在排出管道之前调用 RpcAsyncCompleteCall 管道调用返回管道填充错误状态。
调度后,接收操作将失败。 下次服务器调用 pull 来接收管道数据时,将返回错误。