web.xml中 error-page的正确用法

来源:互联网 发布:写作文软件app 编辑:程序博客网 时间:2024/05/17 12:50

最近在review别的team的代码,发现error-page没有被用的很好。


他们的web.xml中关于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>


看样子貌似几乎所有常见的服务器端的异常都被覆盖到了,出现这些异常的话页面会到error.jsp中。


但是这样就够了吗, 显然是不够的,仔细阅读他们代码,会发现他们有很多异常都有可能被抛出来而没有得到非常妥当的处理。


比如说他们的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;
    }


显然这个方法是没有正确处理异常的,因为传入的homeAddr入参可能为空,如果这样的话,那么所有点操作符都会抛NullPointerException,而这里显然没有对入参进行控制,而且代码中也没有对异常进行处理,我查看了下,所有调用这个方法的方法也都没有对异常进行处理。所以如果假设真正应用上线后遇到了一个homeAddr为空的地方,那么这段代码就会抛异常而不会继续走下去,没有好好处理的结果可能是灾难性的,前端用户会面对一大段异常文本而不知所措。



当然了,这段代码最好的方案还是对入参进行严格控制,并且在代码中吧异常直接处理掉,所谓“能自己处理就不要丢给上级” ,当然了,我们为了以防万一,还是必须在web.xml中定义一个 error-page选项,来把好最后一关,也就是就算真正出这个异常了,也会到出错页面,而不是一个无法控制的页面。


所以我们需要在web.xml中增加一个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>

这样应用就更加robust了。  

0 0
原创粉丝点击