在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重新進行過處理。
以上,僅用於學習和總結
