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