錯誤處理
gRPC 如何處理錯誤,以及 gRPC 錯誤碼。
錯誤處理
標準錯誤模型
如您在我們的概念文件和範例中所見,當 gRPC 呼叫成功完成時,伺服器會向客戶端返回一個 OK
狀態(根據語言,OK
狀態可能不會在您的程式碼中直接使用)。但如果呼叫不成功會發生什麼事?
如果發生錯誤,gRPC 會返回其錯誤狀態碼之一,以及一個可選的字串錯誤訊息,其中提供有關發生情況的更多詳細資訊。錯誤資訊在所有支援的語言中都可供 gRPC 客戶端使用。
更豐富的錯誤模型
上述錯誤模型是官方的 gRPC 錯誤模型,所有 gRPC 客戶端/伺服器程式庫都支援它,並且獨立於 gRPC 資料格式(無論是協定緩衝區或其他格式)。您可能已經注意到它相當有限,並且不包括傳達錯誤詳細資訊的能力。
但是,如果您將協定緩衝區用作資料格式,您可能希望考慮使用 Google 開發和使用的更豐富的錯誤模型,如此處所述。此模型使伺服器能夠返回,而客戶端能夠使用以一個或多個 protobuf 訊息表示的其他錯誤詳細資訊。它還進一步指定了一組標準的錯誤訊息類型,以涵蓋最常見的需求(例如無效的參數、配額違規和堆疊追蹤)。此額外錯誤資訊的 protobuf 二進位編碼在回應中以尾隨中繼資料的形式提供。
C++、Go、Java、Python 和 Ruby 程式庫已支援此更豐富的錯誤模型,而且至少 grpc-web 和 Node.js 程式庫都有要求它的公開問題。如果需求量大,其他語言程式庫將來可能會新增支援,因此如果有興趣,請查看它們的 github 儲存庫。但請注意,以 C 撰寫的 grpc-core 程式庫不太可能支援它,因為它有意與資料格式無關。
如果您未使用協定緩衝區,則可以使用類似的方法(將錯誤詳細資訊放在尾隨的回應中繼資料中),但您可能需要找到或開發程式庫支援才能存取此資料,以便在您的 API 中實際使用它。
但是,在決定是否使用此類擴展的錯誤模型時,有一些重要的注意事項需要注意,包括
- 擴展錯誤模型的程式庫實作在錯誤詳細資訊有效負載的要求和期望方面,可能在不同語言之間不一致
- 現有的代理、記錄器和其他標準 HTTP 請求處理器無法看到錯誤詳細資訊,因此無法將其用於監視或其他目的
- 預告片中的其他錯誤詳細資訊會干擾頭行阻塞,並且由於更頻繁的快取未命中,會降低 HTTP/2 標頭壓縮效率
- 較大的錯誤詳細資訊有效負載可能會遇到協定限制(如最大標頭大小),從而有效遺失原始錯誤
錯誤狀態碼
gRPC 在各種情況下會引發錯誤,從網路故障到未經驗證的連線,每種情況都與特定的狀態碼相關聯。所有 gRPC 語言都支援以下錯誤狀態碼。
一般錯誤
案例 | 狀態碼 |
---|---|
客戶端應用程式取消了請求 | GRPC_STATUS_CANCELLED |
在伺服器傳回狀態之前,截止時間已過期 | GRPC_STATUS_DEADLINE_EXCEEDED |
在伺服器上找不到方法 | GRPC_STATUS_UNIMPLEMENTED |
伺服器正在關閉 | GRPC_STATUS_UNAVAILABLE |
伺服器拋出例外(或執行了除了傳回狀態碼來終止 RPC 以外的其他操作) | GRPC_STATUS_UNKNOWN |
網路故障
案例 | 狀態碼 |
---|---|
在截止時間過期之前未傳輸任何資料。也適用於傳輸了一些資料,並且在截止時間過期之前未偵測到其他故障的情況 | GRPC_STATUS_DEADLINE_EXCEEDED |
在連線中斷之前,已傳輸一些資料(例如,請求中繼資料已寫入 TCP 連線) | GRPC_STATUS_UNAVAILABLE |
協定錯誤
案例 | 狀態碼 |
---|---|
無法解壓縮,但支援壓縮演算法 | GRPC_STATUS_INTERNAL |
伺服器不支援客戶端使用的壓縮機制 | GRPC_STATUS_UNIMPLEMENTED |
達到流量控制資源限制 | GRPC_STATUS_RESOURCE_EXHAUSTED |
流量控制協定違規 | GRPC_STATUS_INTERNAL |
剖析傳回的狀態時發生錯誤 | GRPC_STATUS_UNKNOWN |
未經驗證:憑證無法取得中繼資料 | GRPC_STATUS_UNAUTHENTICATED |
在權限中繼資料中設定了無效的主機 | GRPC_STATUS_UNAUTHENTICATED |
剖析回應協定緩衝區時發生錯誤 | GRPC_STATUS_INTERNAL |
剖析請求協定緩衝區時發生錯誤 | GRPC_STATUS_INTERNAL |
語言支援
多種語言提供了關於如何處理標準錯誤以及更豐富的錯誤詳細資訊的範例程式碼。
語言 | 範例 |
---|---|
C++ | C++ 錯誤處理範例 |
C++ 錯誤詳情範例 | |
Go | Go 錯誤處理範例 |
Go 錯誤詳情範例 | |
Java | Java 錯誤處理範例 |
Java 錯誤詳情範例 | |
Node | Node 錯誤處理範例 |
Python | Python 錯誤詳情範例 |
此 grpc-errors 儲存庫也包含額外的錯誤處理範例。