最近在review別的team的代碼,發(fā)現(xiàn)error-page沒(méi)有被用的很好。
他們的web.xml中關(guān)于error-page的定義如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!--errorpage handler --> < error-page > < error-code >404</ error-code > < location >/WEB-INF/jsp/errors/error.jsp</ location > </ error-page > < error-page > < error-code >500</ error-code > < location >/WEB-INF/jsp/errors/error.jsp</ location > </ error-page > < error-page > < error-code >414</ error-code > < location >/WEB-INF/jsp/errors/error.jsp</ location > </ error-page > < error-page > < error-code >505</ error-code > < location >/WEB-INF/jsp/errors/error.jsp</ location > </ error-page > < error-page > < error-code >400</ error-code > < location >/WEB-INF/jsp/errors/error.jsp</ location > </ error-page > |
看樣子貌似幾乎所有常見(jiàn)的服務(wù)器端的異常都被覆蓋到了,出現(xiàn)這些異常的話頁(yè)面會(huì)到error.jsp中。
但是這樣就夠了嗎, 顯然是不夠的,仔細(xì)閱讀他們代碼,會(huì)發(fā)現(xiàn)他們有很多異常都有可能被拋出來(lái)而沒(méi)有得到非常妥當(dāng)?shù)奶幚怼?/p>
比如說(shuō)他們的CheckoutAddress類的fromHomeAddress()方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public static CheckOutAddress fromHomeAddress(HomeAddr homeAddr) { CheckOutAddress address = new CheckOutAddress(); address.setAddressId(String.valueOf(homeAddr.getId())); address.setCountryId(String.valueOf(homeAddr.getCountry().getId())); address.setCountryName(homeAddr.getCountry().getRegionName()); address.setDetailAddress(homeAddr.getDetailAddress()); address.setFirstName(homeAddr.getFirstName()); address.setLastName(homeAddr.getLastName()); address.setIsDefaultAddress(String.valueOf(homeAddr.getIsDefault())); address.setMobilePhone(homeAddr.getMobilePhone()); address.setCountryPhoneCode(homeAddr.getCountryPhoneCode()); address.setZipCode(homeAddr.getZipCode()); return address; } |
顯然這個(gè)方法是沒(méi)有正確處理異常的,因?yàn)閭魅氲膆omeAddr入?yún)⒖赡転榭?,如果這樣的話,那么所有點(diǎn)操作符都會(huì)拋NullPointerException,而這里顯然沒(méi)有對(duì)入?yún)⑦M(jìn)行控制,而且代碼中也沒(méi)有對(duì)異常進(jìn)行處理,我查看了下,所有調(diào)用這個(gè)方法的方法也都沒(méi)有對(duì)異常進(jìn)行處理。所以如果假設(shè)真正應(yīng)用上線后遇到了一個(gè)homeAddr為空的地方,那么這段代碼就會(huì)拋異常而不會(huì)繼續(xù)走下去,沒(méi)有好好處理的結(jié)果可能是災(zāi)難性的,前端用戶會(huì)面對(duì)一大段異常文本而不知所措。
當(dāng)然了,這段代碼最好的方案還是對(duì)入?yún)⑦M(jìn)行嚴(yán)格控制,并且在代碼中吧異常直接處理掉,所謂“能自己處理就不要丟給上級(jí)” ,當(dāng)然了,我們?yōu)榱艘苑廊f(wàn)一,還是必須在web.xml中定義一個(gè) error-page選項(xiàng),來(lái)把好最后一關(guān),也就是就算真正出這個(gè)異常了,也會(huì)到出錯(cuò)頁(yè)面,而不是一個(gè)無(wú)法控制的頁(yè)面。
所以我們需要在web.xml中增加一個(gè)error-page 元素,如下:
1 2 3 4 | < error-page > < exception-type >java.lang.NullPointerException</ exception-type > < location >/WEB-INF/jsp/errors/error.jsp</ location > </ error-page > |
這樣應(yīng)用就更加robust了。
聯(lián)系客服