最近在review別的team的代碼,發現error-page沒有被用的很好。
他們的web.xml中關於error-page的定義如下:
<!--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>
看樣子貌似幾乎所有常見的伺服器端的異常都被覆蓋到了,出現這些異常的話頁面會到error.jsp中。
但是這樣就夠了嗎, 顯然是不夠的,仔細閱讀他們代碼,會發現他們有很多異常都有可能被拋出來而沒有得到非常妥當的處理。
比如說他們的CheckoutAddress類的fromHomeAddress()方法如下:
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; }
顯然這個方法是沒有正確處理異常的,因為傳入的homeAddr入參可能為空白,如果這樣的話,那麼所有點操作符都會拋NullPointerException,而這裡顯然沒有對入參進行控制,而且代碼中也沒有對異常進行處理,我查看了下,所有調用這個方法的方法也都沒有對異常進行處理。所以如果假設真正應用上線後遇到了一個homeAddr為空白的地方,那麼這段代碼就會拋異常而不會繼續走下去,沒有好好處理的結果可能是災難性的,前端使用者會面對一大段異常文本而不知所措。
當然了,這段代碼最好的方案還是對入參進行嚴格控制,並且在代碼中吧異常直接處理掉,所謂“能自己處理就不要丟給上級” ,當然了,我們為了以防萬一,還是必須在web.xml中定義一個 error-page選項,來把好最後一關,也就是就算真正出這個異常了,也會到出錯頁面,而不是一個無法控制的頁面。
所以我們需要在web.xml中增加一個error-page 元素,如下:
<error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/WEB-INF/jsp/errors/error.jsp</location></error-page>
這樣應用就更加robust了。
本文出自 “平行線的凝聚” 部落格,請務必保留此出處http://supercharles888.blog.51cto.com/609344/1338856