Servlet的异常处理机制

来源:互联网 发布:csgo残局 知乎 编辑:程序博客网 时间:2024/04/20 03:43
一.在Servlet中,有两种服务器端异常处理机制
1.声明试异常处理(declarative exception handling)
2.程序试异常处理(programmatic exception handling)
 
声明试异常处理
声明试异常处理是在web.xml文件中声明对各种异常的处理方法,这是通过<error-page>元素来声明的.

<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    //WEB应用/某SERVLET

java.lang.arithmeticException: /by zero  //何种异常

声明试异常处理实现简单,直接在WEB.XML文件中进行配置就可以,可以处理HTTP错误代码和JAVA异常,缺点是异常处理很单一,针对每种异常都需要在WEB.XML文件中进行配置,由于抛出异常的异常被SERVLET容器处理并做出响应,无法得知是那段程序代码出现了问题.

 

程序试异常处理容易了解异常在代码中的位置,而且对于同一种异常,可以由不同的程序段抛出,并在catch语句中进行处理,还可以利用RequestDispatcher将不同的异常交给同一个servlet进行统一处理. 缺点是无法处理HTTP错误,编码量大.

0 0
原创粉丝点击