剛進(jìn)公司,參加了兩個(gè)項(xiàng)目一個(gè)是日本外包,一個(gè)是自己的產(chǎn)品。這個(gè)兩個(gè)系統(tǒng)在設(shè)計(jì)上都有一個(gè)要求,就是業(yè)務(wù)邏輯要放到Service層來(lái)完成,Action中盡量少寫(xiě)東西。這一點(diǎn)可以理解,但是存在這樣一個(gè)問(wèn)題,在service中進(jìn)行業(yè)務(wù)邏輯處理時(shí)免不了要發(fā)生問(wèn)題,要把這些問(wèn)題顯示在頁(yè)面上,但是service層不能直接接觸到action,所以著這兩個(gè)項(xiàng)目中的設(shè)計(jì)方法上使吧actionmessages對(duì)象給了service。我認(rèn)為這樣做很不好,這樣service對(duì)表現(xiàn)曾的依賴(lài)就太大了,因?yàn)锳ctionMessages是Struts的東西,也就是說(shuō)這個(gè)serivce只能用來(lái)對(duì)Struts提供服務(wù)了。我認(rèn)為應(yīng)該在service曾定義好異常情況,遇到問(wèn)題時(shí)拋出異常(RuntimeException),然后再表現(xiàn)層根據(jù)異常種類(lèi)做出相應(yīng)的動(dòng)作。這樣就是view層依賴(lài)于serivce層,而service層可以為更多種view層提供服務(wù)了。但是這樣也有一些問(wèn)題,就是如果serivce邏輯復(fù)雜,可能異常種類(lèi)就非常多,這樣項(xiàng)目做起來(lái)也很麻煩。 但是剛進(jìn)公司也沒(méi)有什么發(fā)言權(quán),估計(jì)前輩們也知道這樣做不好,但是估計(jì)是為了項(xiàng)目做起來(lái)不會(huì)太麻煩吧。
大家有沒(méi)有更好的辦法?
大家有沒(méi)有更好的辦法?
Actions 負(fù)責(zé)撲捉異常
這樣可以吧?
定義自己的應(yīng)用異常,
異常里面可以自定義錯(cuò)誤編號(hào),錯(cuò)誤信息等錯(cuò)誤信息,actions可以統(tǒng)一處理。
我一般都是
throws new ServeciException("error.username.isexist",e);
當(dāng)然,每個(gè)層最好還是定義個(gè)異常類(lèi)。
1.這樣和error code 的形式想比會(huì)使這種business exception顯示的表示, 會(huì)有type check之類(lèi)的益處, 同時(shí)異常的名字會(huì)很清晰的表明它的業(yè)務(wù)意義.
2.會(huì)強(qiáng)迫controller層對(duì)這個(gè)異常進(jìn)行處理(或者繼續(xù)向上拋)
盡管有這些益處,但缺點(diǎn)也有:
1.有時(shí)會(huì)造成business exception過(guò)多的情況, 業(yè)務(wù)方法的throws 語(yǔ)句會(huì)很長(zhǎng),使得業(yè)務(wù)方法看起來(lái)很Ugly.
2.因?yàn)槭莄hecked exception,一旦service 層的業(yè)務(wù)方法增加一個(gè)異常,將使得controller受到影響, 這種影響會(huì)從service層向外傳播.
針對(duì)缺點(diǎn) 1, 應(yīng)該謹(jǐn)慎設(shè)計(jì)一些業(yè)務(wù)方法, 如果發(fā)現(xiàn)拋出的business exceptin過(guò)長(zhǎng), 問(wèn)問(wèn)自己是不是這個(gè)方法承擔(dān)的責(zé)任太多, 或者一些business exception可以合并為一個(gè)有意義的異常.
針對(duì)缺點(diǎn) 2, 沒(méi)有辦法,這是checked exception的特點(diǎn), 任何事物都是兩面性.
一般的business exception都會(huì)在controller層try/catch,返回相應(yīng)的信息到客戶(hù)端, 目的是告訴客戶(hù)問(wèn)題出在哪里,讓他們恢復(fù).所以我們可以認(rèn)為這些異常是可恢復(fù)的異常,這是business exception作為checked exception的一個(gè)理由.