次の方法で共有


エラー処理 (RPC)

同期 RPC では、クライアントは成功または失敗のコードを使用して返すリモート呼び出しを行います。 非同期 RPC を使用すると、呼び出しが失敗する機会が増え、発生する場所とタイミングに応じて、これらのエラーが異なる方法で処理されます。 次の表では、呼び出しが失敗する方法と、その処理方法について説明します。

クライアント側のクリーンアップ

障害の症状 クリーンアップ
クライアントは、リモート プロシージャを呼び出すときに例外をキャッチします。 RPC API 呼び出しは必要ありません。 すべての RPC 状態がクリーンアップされました。
クライアントは通話完了通知を受け取りますが、RpcAsyncCompleteCall呼び出すと、エラー コードを受け取ります。 RPC API 呼び出しは必要ありません。 すべての RPC 状態がクリーンアップされました。
クライアントは、非中止または中止キャンセルを発行します。 クライアントは通知を待機し、通知が到着したときに RpcAsyncCompleteCall呼び出す必要があります。

 

サーバー側のクリーンアップでは、重要な概念がハンドオフ ポイントです。 非同期呼び出しのサーバー側の処理中は、通常、呼び出しを受け取ったスレッド (ディスパッチャー スレッドとも呼ばれます) で一部の処理が実行され、必要に応じて、ディスパッチャー スレッドはメモリ ブロックに十分な状態を設定し、別のスレッド (ワーカー スレッドとも呼ばれます) に通知して呼び出しの処理を続行します。 ディスパッチャー スレッドがワーカー スレッドが ハンドオフ ポイント呼び出されたことを正常に通知する瞬間。

サーバー側のクリーンアップ

エラーが発生しました クリーンアップ
ハンドオフ ポイントの前。 例外をスローします。 RpcAsyncCompleteCall呼び出す必要はありません。
引き渡しポイントの後。 RpcAsyncAbortCall呼び出すか、エラーが致命的ではなく、クライアントに結果を返すことができる場合は、RpcAsyncCompleteCall RpcAsyncCompleteCall 関数呼び出しが失敗した場合、RPC ランタイムはパラメーターを解放します。 ユーザーは、これらのパラメーターにアクセスできません。 ディスパッチャー スレッドは、呼び出しを安全に中止できなくなったため、ハンドオフ ポイント後に失敗する可能性のある大量の処理を実行しないでください。 具体的には、ハンドオフ ポイントの後に例外をスローしたり、サーバーがクラッシュしたりする可能性があります。

 

パイプの特殊エラー処理ケース

パイプを使用する場合、エラー処理には特別なケースがあります。 次の一覧では、エラーの原因と、エラーの処理方法について説明します。

障害の原因 処理方法
クライアント呼び出しがプッシュされ、呼び出しが失敗します。 RPC API 呼び出しは必要ありません。 すべての RPC 状態がクリーンアップされました。
パイプ内のがドレインされる前に、RpcAsyncCompleteCallクライアント呼び出し。 適切なパイプ入力エラー コードで呼び出しが失敗します。
クライアント呼び出しがプルされ、呼び出しが失敗します。 RPC API 呼び出しは必要ありません。 すべての RPC 状態がクリーンアップされました。
クライアントまたはサーバーがプッシュを呼び出すか、間違った順序でプルします。 実行時は、パイプ入力エラーの状態を返します。
サーバーがプッシュまたはプルを呼び出すと、呼び出しが失敗します。 Push はエラー コードを返します。 RpcAsyncCompleteCall呼び出す必要はありません。
サーバーは、パイプ ドレインされる前に RpcAsyncCompleteCall を呼び出します。 パイプ呼び出しは、パイプの充填エラー状態を返します。
ディスパッチ後、受信操作は失敗します。 次にサーバーがプルを呼び出してパイプ データを受信すると、エラーが返されます。