一.在Servlet中,有两种服务器端异常处理机制
<error-page>
<error-code>or<exception-type>
<location>
其中<error-code>元素指定HTTP的错误代码,<exception-type>元素指定JAVA异常类的完整限定名.
<location>元素给出用于响应HTTP错误代码或者JAVA异常的资源的路径,该路径是相对于WEB应用程序根路径的位置.
<error-page>元素可以声明两种类型的错误处理:一是指定对HTTP错误代码的处理,二是指定对程序中产生的JAVA异常的处理.
二.HTTP错误代码的处理
在WEB.XML文件中对HTTP404错误指定相应的错误处理页面.
<error-page>
<error-code>404</error-code>
<location>/FileNotFound.html</location>//该路径为相对于WEB应用程序根路径的位置,必须以/开头.
</error-page>
在上例中<error-code>元素指定了HTTP的错误代码,<location>子元素指定了响应HTTP404错误的页面路径.
三.JAVA异常的处理
利用<error-page>元素还可以声明对程序中产生的JAVA异常的处理,例如一个SERVLET从文件中读取配置信息,如果该文件不存在,就会抛出java.io.FileNotFoundException异常.例:
<error-page>
<exception-type>java.io.FileNotFoundException</exception-type>
<location>/ExcepHandler</location>
</error-page>
在<error-page>元素中,<exception-type>子元素指定了JAVA异常类的名字,<location>子元素指定了对异常进行处理的servlet类,当然,也可以指定一个静态页面对异常进行响应.
声明试异常处理主要是在WEB.XML文件中声明对各种异常的处理方法,他的好处是开发人员在开发WEB应用程序时无须考虑什么时候会产生HTTP错误或抛出JAVA异常,这些都交给SERVLET容器进行处理,他的缺点是,必须针对可能出现的各种错误情况定义处理页面或SERVLET,否则某些HTTP错误或异常将无法处理.
程序试异常处理
程序异常处理就是在WEB程序中利用TRY-CATCH语句来捕获的异常,并对捕获的异常进行相应的处理.
一.使用RequestDispatcher来处理异常
利用RequestDispathcher将请求转发给其他的SERVLET进行处理,也可以将异常封装在一个请求中,然后利用RequestDispatcher转发给一个异常处理SERVLET进行统一的处理.
如果在一个WEB应用程序,有多个SERVLET可能抛出相同的异常,采用这种方式对异常进行处理,可以避免在多个SERVLET中编写同样的异常处理代码.
例:
try{
int a=5;
int b=0;
int c=a/b;
}
catch(ArithmeticException e){
req.setAttribute("javax.servlet.eror.exception",e);
req.setAttribute("javax.servlet.error.request_uri",req.getRequestURI());
RequestDispatcher rd=req.getRequestDispatcher("xxxxx");
rd.forward(req,resp);
}
我们将抛出异常的SERVLET的位置做为HttpServletRequest对象的属性保存到请求对象中,然后通过RequestDispatcher对象的forward()方法将请求转发给XXXX,而XXXXX可以从请求对象中取出异常对象和位置.
XXX.SERVLET:
String uri=(String)req.getAttribut("javax.servlet.error.request_uri")
Object excep=req.getAttribute("javax.servlet.error.exception")
通过上面这2句可以从某个抛出异常的SERVLET中取出异常对象和抛出异常的SERVLET的位置做为req.getAttribut的参数获取出来进行处理.
显示为:/xxx/xxx
java.lang.arithmeticException: /by zero
声明试异常处理实现简单,直接在WEB.XML文件中进行配置就可以,可以处理HTTP错误代码和JAVA异常,缺点是异常处理很单一,针对每种异常都需要在WEB.XML文件中进行配置,由于抛出异常的异常被SERVLET容器处理并做出响应,无法得知是那段程序代码出现了问题.
程序试异常处理容易了解异常在代码中的位置,而且对于同一种异常,可以由不同的程序段抛出,并在catch语句中进行处理,还可以利用RequestDispatcher将不同的异常交给同一个servlet进行统一处理. 缺点是无法处理HTTP错误,编码量大.