Servlet异常处理:
1:web应用中常见的几种异常
Http错误代码 | 可能产生的原因 |
401 | 用户权限不足 |
403 | 服务器已经结束客户端的请求,未作出相应的相应(等待客户端的进一步操作) |
404 | 读取的文件不存在获取URL错误 |
408 | 链接超时 |
500 |
内部服务器错误,通常是由于程序撰写不佳,导致异常产生时未及时被截获 |
503 |
HTTP服务器过于忙碌,暂时无法提供服务 |
2:声明式异常处理
- 声明式异常处理就是在web.xml中声明各种异常的处理方法,有可分为以下两类:
- 处理HTTP异常
- 处理Java异常
- 声明式异常在web.xml中的配置
- 声明式异常处理必须在web.xml中通过<error-page>进行设定
<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page>
3:程序化异常的处理
- 程序化异常处理就是在java应用程序内利用try-catch来截获可能抛出的异常,并决定各种异常的处理方式,特点如下:
(1) 通过try-catch语句,可以在应用程序内截获任何java异常
(2) 无需设定web.xml
(3) 异常由应用程序自行处理,与Servlet容器无关- 程序化异常处理可分为两类:
(1) 在try-catch中直接处理异常
(2) 将异常转交给其他Servlet处理
4:声明式异常和程序化异常之间的比较
- 声明式异常的优点和缺点
- 优点:
(1)实现容易
(2)可以处理HTTP错误与Java应用程序异常 - 缺点
(1)异常处理能力的弹性低
(2)不容易找出异常发生的真正位置
(3)不容易细分异常的等级
- 优点:
- 程序化异常的优点和缺点
- 优点
(1)容易了解异常的发生与处理的关系
(2)较有弹性的异常处理能力 - 缺点
(1)在程序内可能要撰写大量的代码
(2)无法处理HTTP错误
- 优点
5:使用
声明式异常的处理
1:可以直接写一个展示错误的页面error.html在web.xml进行配置
2:或者编写一个用来处理错误的Servlet类来处理(重写HttpServlet类的service()方法。调用请求对象getAttribute()方法得到javax.servlet.error.status_code属性的值,当发生HTTP错误的时候, Servlet容器会自动将HTTP的错误代码作为javax.servlet.error.status_code 属性的值,保存在请求的对象中。部署好这个servlet。location修改为servlet的location)
// HTTP协议的状态码
Integer statusCode
=
(Integer)request.getAttribute("javax.servlet.error.status_code");
out.println(String.format("status_code: %s", statusCode));
// 未捕获的异常类名
Class<?> exceptionType =
(Class<?>)request.getAttribute("javax.servlet.error.exception_type");
out.println(String.format("exception_type: %s",
exceptionType));
//
错误发生画面response.sendError设置的消息
//
或者未捕获的异常的消息
String message =
(String)request.getAttribute("javax.servlet.error.message");
out.println(String.format("message: %s", message));
//
未捕获的异常
Throwable throwable =
(Throwable)request.getAttribute("javax.servlet.error.exception");
out.println(String.format("Throwable: %s", throwable));
//
当前请求URI
String requestUri =
(String)request.getAttribute("javax.servlet.error.request_uri");
out.println(String.format("request_uri: %s", requestUri));
// 错误画面的Servlet
String servletName =
(String)request.getAttribute("javax.servlet.error.servlet_name");
out.println(String.format("servlet_name: %s", servletName));