更新時間:2022-03-18 11:58:48 來源:動力節(jié)點 瀏覽2485次
我們的項目使用了dubbo進行不同系統(tǒng)之間的調(diào)用。
每個項目都有一個全局的異常處理,對于業(yè)務(wù)異常,我們會拋出自定義的業(yè)務(wù)異常(繼承RuntimeException)。
全局的異常處理會根據(jù)不同的異常類型進行不同的處理。
最近我們發(fā)現(xiàn),某個系統(tǒng)調(diào)用dubbo請求,provider端(服務(wù)提供方)拋出了自定義的業(yè)務(wù)異常,但consumer端(服務(wù)消費方)拿到的并不是自定義的業(yè)務(wù)異常。
這是為什么呢?還需要從dubbo的ExceptionFilter說起
我們來看看dubbo官方文檔的推薦處理方式是什么

從上面我們可以看出,dubbo的處理方式主要是:
1. 如果provider實現(xiàn)了GenericService接口,直接拋出
2.如果是checked異常,直接拋出
3.在方法簽名上有聲明,直接拋出
4.異常類和接口類在同一jar包里,直接拋出
5.是JDK自帶的異常,直接拋出
6.是Dubbo本身的異常,直接拋出
7.否則,包裝成RuntimeException拋給客戶端
接下來我們來測試一下
我們自定義一個SelfException
在服務(wù)端中拋出一個自定義的異常
啟動服務(wù)對并對服務(wù)端進行訪問,我們可以發(fā)現(xiàn)
服務(wù)端的日志
客戶端的日志
可以看出, 我們這里并沒有拋出自定義的異常, 從而會導(dǎo)致客戶端沒有捕捉到自定義的異常.
如何正確捕獲業(yè)務(wù)異常
拋出一個自定義異常有這么麻煩嗎? 主要原因是dubbo沒有支持的原因.
既然這樣,我們把dubbo變的支持不就可以了?
是的.把源碼改一下就OK了.如下:
或者直接將117行的RuntimeException替換成自己的自定義異常!這樣就從根本上解決了異常處理的問題.后續(xù)有其他問題,也可以直接修改。
通過上述相信大家對Dubbo的異常處理已經(jīng)有所了解,大家如果對此比較感興趣,想了解更多相關(guān)知識,不妨來關(guān)注一下動力節(jié)點的Java在線學習,里面的課程內(nèi)容從入門到精通,很適合沒有基礎(chǔ)的小伙伴學習,希望對大家能夠有所幫助。