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 。 | 管道呼叫會傳回管道填滿錯誤狀態。 |
分派之後,接收作業會失敗。 | 下次伺服器呼叫提取以接收管道資料時,會傳回錯誤。 |