? ? ? ? 今天提到了一個(gè)異常相關(guān)的概念——異常鏈,也就是下層拋出的 異常經(jīng)由try - catch 處理轉(zhuǎn)換成一種上層需要的異常槽华。比如提到的下面這個(gè)AbstractSequentialList類中找不到對應(yīng)的element,下層拋出NoSuchElementException轉(zhuǎn)換成為了上層List中需要的IndexOutOfBoundsException。
? ? ? ? 這種處理從概念來說很好庇勃,因?yàn)楹芏鄷r(shí)候代碼復(fù)用會(huì)導(dǎo)致我們不知道這一次的調(diào)用和設(shè)計(jì)API的初衷是否相同。就像昨天下午分享提到的莺葫,在前臺(tái)頁面添加的功能越來越多,導(dǎo)致后臺(tái)代碼會(huì)出現(xiàn)一些問題枪眉,而本身方法的調(diào)用也越來越泛濫捺檬,修改其中一個(gè)地方容易引起B(yǎng)ug。所以很多下層引起的問題贸铜,就應(yīng)該先在下層解決堡纬,不應(yīng)該再由上層過多處理。
? ? ? ? 但是從我們系統(tǒng)本身出發(fā)蒿秦,一方面是很多異常其實(shí)都是業(yè)務(wù)上的數(shù)據(jù)或者業(yè)務(wù)邏輯帶來的烤镐,而我們本身有一套errorCode來表示對應(yīng)的異常,在transaction運(yùn)行的最后會(huì)對OperationResult進(jìn)行統(tǒng)一翻譯處理棍鳖,這一部分的業(yè)務(wù)異常就不需要過多考慮炮叶。另一方面則是系統(tǒng)框架或者Java本身運(yùn)行的一些異常,比如樂觀鎖渡处,在一些接口中觸發(fā)樂觀鎖拋出的錯(cuò)會(huì)在下面判斷轉(zhuǎn)換成可以被retry的異常镜悉,交由上層判斷是否重發(fā)。這一部分的內(nèi)容就可以考慮使用異常鏈医瘫。
? ? ? ? 至于后面第75條提到的包含失敗信息侣肄,上面也有提到一個(gè)是業(yè)務(wù)報(bào)錯(cuò),自有對應(yīng)的代碼處理醇份。而其他異常在transaction中也會(huì)使用getCause的方法獲取具體內(nèi)容稼锅。