以下内容引用自http://wiki.jikexueyuan.com/project/jsp/exception-handling.html:
当写JSP代码的时候,有可能会留下一个编码错误,并且它会出现在代码的任何一个部分。在JSP代码中会有以下类型的错误:
- 检测异常(Checked exceptions):一个检测异常通常是一个用户错误或者是一个有程序员无法预见的错误引起的异常。例如,如果要打开一个文件,但是无法找到该文件,这时就会出现异常。这些异常在编译时不能简单的忽略掉。
- 运行异常(Runtime exceptions):一个运行异常可能是程序员本来可以避免的一个异常。和检测异常相反,运行异常在编译时可以被忽略。
- 错误(Errors):这原本不是异常,是超出用户或者程序员的控制而引起的问题。错误通常在代码中会被忽略,因为对一个错误能够做的很少。例如,如果一个堆栈发生溢出,那么就会出现一个错误。在编译时他们也会被忽略。
一、使用异常对象
异常对象是Throwable子类的一个实例(例如,java.lang.NullPointerException),它只能在错误页面是可用的。下面是Throwable类中可用的重要方法的列表。
方法 | 描述 |
---|---|
public String getMessage() |
返回发生异常的详细信息。这个消息是在Throwable构造函数里初始化的。 |
public Throwable getCause() |
返回发生异常的原因,用一个Throwable对象表示。 |
public String toString() |
返回与getMessage()相连接的类名。 |
public void printStackTrace() |
输出toString()和堆栈跟踪的System.err的结果,错误输出流。 |
public StackTraceElement [] getStackTrace() |
返回一个数组,其中包含堆栈跟踪的每一个元素。索引值为0的元素表示调用堆栈的顶部, 数组中最后一个元素在调用堆栈的底部代表方法。 |
public Throwable fillInStackTrace() |
用当前的堆栈跟踪填满Throwable对象的堆栈跟踪,添加任何先前的堆栈跟踪信息。 |
JSP会给一个选项来指定每一个JSP的错误页面。不管何时页面抛出一个异常,JSP容器都会自动的调用错误页面。
下面是main.jsp中一个特定错误页面的例子。为了创建一个错误页面,使用<%@ page errorPage=”xxx”%>指令。
<%@ page errorPage="ShowError.jsp" %> <html> <head> <title>Error Handling Example</title> </head> <body> <% // Throw an exception to invoke the error page int x = 1; if (x == 1) { throw new RuntimeException("Error condition!!!"); } %> </body> </html>
现在需要写一个错误处理的JSP:ShowError.jsp,下面给出了代码。注意,错误处理页面包括<%@ page isErrorPage=”true”%>指令。这个指令使JSP编译器生成异常实例变量。
<%@ page isErrorPage="true" %> <html> <head> <title>Show Error Page</title> </head> <body> <h1>Opps...</h1> <p>Sorry, an error occurred.</p> <p>Here is the exception stack trace: </p> <pre> <% exception.printStackTrace(response.getWriter()); %> </pre> </body> </html>
现在试图访问main.jsp,它将会生成如下结果:
二、在错误页面使用JSTL标签
可以使用JSTL标签来编写一个错误页面ShowError.jsp。这个页面和上面的例子中几乎使用的是相同的逻辑,但是它有更好的结构,并且他提供了更多的信息:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page isErrorPage="true" %> <html> <head> <title>Show Error Page</title> </head> <body> <h1>Opps...</h1> <table width="100%" border="1"> <tr valign="top"> <td width="40%"><b>Error:</b></td> <td>${pageContext.exception}</td> </tr> <tr valign="top"> <td><b>URI:</b></td> <td>${pageContext.errorData.requestURI}</td> </tr> <tr valign="top"> <td><b>Status code:</b></td> <td>${pageContext.errorData.statusCode}</td> </tr> <tr valign="top"> <td><b>Stack trace:</b></td> <td> <c:forEach var="trace" items="${pageContext.exception.stackTrace}"> <p>${trace}</p> </c:forEach> </td> </tr> </table> </body> </html>
现在试图访问main.jsp,它将会生成如下结果:
三、使用Try...Catch块
如果想要在同一个页面中处理错误,使用一些动作而不是释放一个错误页面,那么可以利用Try...catch块。
下面显示的是如何使用try...catch块的一个简单的例子。将下面的代码放到main.jsp中:
<html> <head> <title>Try...Catch Example</title> </head> <body> <% try{ int i = 1; i = i / 0; out.println("The answer is " + i); } catch (Exception e){ out.println("An exception occurred: " + e.getMessage()); } %> </body> </html>
现在试图访问main.jsp,它将会生成如下结果:
测试工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test22