前言:
开发web程序的时候,我们总是希望用户在浏览我们网站的时候即使应用程序出错也能看到比较友好的信息提示,同时又想将应用程序发生的错误能够记录下来,以备管理员来解决相关问题.虽然非开发人员的浏览器在发生错误的时候一般会显示友好的提示信息,但这样的信息单调又没有针对性,所以有必要根据自己应用程序的需要处理相关错误并返回给用户针对本站的错误提示信息,如:"服务器内部处理出错,请稍后再试 返回首页" 这样的友好提示.
1.简单的jsp程序中异常处理:通过在page指令上制定errorPage 和 isErrorPage属性,就可以在设定了errorPage属性页面真的抛出了异常或发生错误的时候转发到对应的isErrorPage="true"的错误处理页面,再通过jsp的内置对象exception就可以得到异常信息,就可以在这里记录日志,发送error_mail了。
但是更多的情况是,servlet才是抛出异常的主要来源,如何像在jsp那样处理servlet的异常呢?
2.servelt抛出异常的处理:解决方法主要是在web.xml中配置errorPage元素,这又有两种方式可以考虑。
(1) 笼统的将所有的应用程序错误或异常归结为500错误,然后配置处理程序:
1
2
3
4
|
<
error-page
>
<
error-code
>500</
error-code
>
<
location
>/500.jsp</
location
>
</
error-page
>
|
在500.jsp可以通过这样的方式获得exception信息:
1
|
request.getAttribute(
"javax.servlet.error.exception"
);
|
服务器在转发到这个500.jsp的时候已经封转好了一些跟异常或错误相关的信息到request对象的Attribute中,使用时可以直接getAttribute获取,我也只记得这一个,有一篇文章里面介绍的很好,后面会给出这篇文章的连接。
(2) 针对特定的异常指定相应的异常处理程序,这将不再是用error-code来指定错误类型了,而是如下的设置:
1
2
3
4
|
<
error-page
>
<
exception-type
>java.lang.NullPointException</
exception-type
>
<
location
>/500.jsp</
location
>
</
error-page
>
|
应该很容易看懂,跟上面同样的方式可以获得有关具体异常的信息(getAttribute...),也许你不喜欢用jsp来处理错误,那你可以把它交给servelt来做,或者mvc中的action:
1
2
3
4
|
<
error-page
>
<
exception-type
>java.lang.NullPointException</
exception-type
>
<
location
>/error</
location
>
</
error-page
>
|
为此需要配置一个servlet:
1
2
3
4
5
6
7
8
9
|
<
servlet
>
<
servlet-name
>ErrorHandler</
servlet-name
>
<
servlet-class
>serlet.ErrorHandler</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>ErrorHandler</
servlet-name
>
<
url-pattern
>/error</
url-pattern
>
</
servlet-mapping
>
|
也许你觉得前面通过制定500的错误更好一些,毕竟发生了任何错误都可以由它来处理,而这里单独的指定某个异常并不能解决其他异常处理问题,但是我个人认为后面的处理方式更符合我自己思考这个问题时的思路,尤其是当我们在应用程序中设计了一些自定义的RuntimeException时。比如dao层中可能会将SQLException当作诱因,然后throw一个自定义的DBException(RuntimeException)来处理,也可以自定义一个全局的应用程序的RuntimeException : ApplicationException,然后让DBException继承它,最后在error-Page中指定exception-type 为package.ApplicationException:
1
2
3
4
|
<
error-page
>
<
exception-type
>package.ApplicationException</
exception-type
>
<
location
>/500.jsp</
location
>
</
error-page
>
|
这样程序中的任意ApplicationException都能得到处理。
3 还有一些总结:
(1) 有时候jsp 设置了errorPage和isErrorPage属性,但是在浏览器中访问只能看到500的错误提示,并没有看到错误页面,只要将浏览器Internet选项显示友好提示信息的勾去掉就好了
(2) jsp假如配置了errorPage同时web.xml里面又配置了500或相应exception-type的error-page,当jsp发生错误和异常时,服务器调用jsp的errorPage来处理,而servelt发生的异常只由500或exception-type指定的location对应处理程序来处理。
有关java异常的处理这里有篇我觉得还不错的文章:
osc中也有类似500的处理代码: