(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 来接收管道数据时,将返回错误。 |