在Grpc的實際使用中,需要對Grpc的異常進行封裝,在架構時發現,客戶端中正常的Exception無法捕獲到在Grpc服務端拋出的異常,經過仔細排查問題得到解決,記錄下便於查漏補缺
代碼結構如下:其中GrpcClientAPi為客戶端,GrpcServer為服務端。


首先在ProtobufNet中自定義一個ApiException類,繼承自Exception

在GrpcClientApi中定義了中間件LogRequestMiddleware用於捕獲異常。如果拋出了ApiException異常,則會被我們捕獲

(1)ApiException實例測試:
客戶端GrpcClientAPi:


中間件LogRequestMiddleware:


結果:


然而,在服務端GrpcServer拋出ApiException異常,中間件無法攔截具體的錯誤信息
(2)ApiException在Grpc的實例測試
客戶端GrpcClientAPi:

服務端GrpcServer:

中間件不變,結果如下:


無法捕獲到自定義的異常。於是去官網搜了下rpc異常的相關資料,RpcException特地用於在rpc中進行異常處理。
(3)RpcException測試
客戶端GrpcClientAPi不變
服務端GrpcServer:


中間件添加對RpcException的捕獲:


結果:


(4)Exception測試
結果:


總結:
在Grpc中,自定義的Exception(本文以ApiException為例),無法被顯示識別,除了官方提供的RpcException,但奇怪的是ApiException和RpcExceprion都繼承自Exception。
猜測應該在返回結果時統一對Grpc的異常通過RpcException重新進行過處理。
以上,僅用於學習和總結