溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

dubbo將異常轉(zhuǎn)換成RuntimeException的原因是什么

發(fā)布時(shí)間:2023-03-21 13:49:22 來(lái)源:億速云 閱讀:101 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“dubbo將異常轉(zhuǎn)換成RuntimeException的原因是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“dubbo將異常轉(zhuǎn)換成RuntimeException的原因是什么”吧!

問(wèn)題

開發(fā)過(guò)程中,發(fā)現(xiàn)服務(wù)提供者拋出了自定義的BusinessException,到了消費(fèi)者這邊,卻變成了RuntimeException。

客戶端這邊有BusinessException這個(gè)類,提供者拋出的也是這個(gè)類的異常,為什么會(huì)被轉(zhuǎn)成RpcException呢?

代碼分析

看ExceptionFilter的代碼:

dubbo將異常轉(zhuǎn)換成RuntimeException的原因是什么

重點(diǎn)就在圈起來(lái)的3個(gè)地方:

1、有異常,而且接口不能是GenericService才需要判斷是否需要轉(zhuǎn)換成RuntimeException,不然直接返回result。

2、如果是受檢異常,則不轉(zhuǎn)換,直接返回。

3、如果不是受檢異常,則需要判斷該異常是否在方法上聲明拋出,如果有聲明就不轉(zhuǎn)換,直接返回。

如果不是上面的這三種情況,就會(huì)去到兜底邏輯:

dubbo將異常轉(zhuǎn)換成RuntimeException的原因是什么

兜底判斷也是有三點(diǎn):

1、判斷接口和異常是否在一個(gè)jar包中,如果是在一個(gè)jar包,不需要轉(zhuǎn)換成RuntimeException。

2、如果異常是java異常,不需要處理。

3、異常類型是RpcException,不需要處理。?

如果這三者都不滿足,就會(huì)到達(dá)代碼:

return new RpcResult(new RuntimeException(StringUtils.toString(exception)));

異常會(huì)被轉(zhuǎn)成字符串,作為RuntimeException的構(gòu)造函數(shù)入?yún)ⅰ?/p>

結(jié)論

由于BusinessException是在一個(gè)通用工具包中,和接口不在一個(gè)jar包中,BusinessException也不是受檢異常,所以不滿足不轉(zhuǎn)換的條件。

要讓提供者拋出的異常不被轉(zhuǎn)成RuntimeException,可以在定義方法的時(shí)候,聲明 throws BusinessException。

思考

為什么dubbo要這樣判斷是否需要轉(zhuǎn)成RuntimeException呢?

個(gè)人覺(jué)得,依據(jù)是消費(fèi)者能否反序列化成對(duì)應(yīng)的異常類,消費(fèi)端有拋出的這個(gè)異常類,就能成功反序列化。

1、能拋出受檢異常,那么在方法上必然聲明了拋出該異常,客戶端包里會(huì)有該異常類

2、同理,如果不是受檢異常,但是在方法上聲明了,客戶端也會(huì)有

3、如果接口和異常類是在同一個(gè)jar吧,說(shuō)明客戶端包里有異常類

4、jdk自己的異常類,自然是存在的

5、RpcException是dubbo自己的異常類,消費(fèi)者必然也有

到此,相信大家對(duì)“dubbo將異常轉(zhuǎn)換成RuntimeException的原因是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI