当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出如今程序的任何地方。JSP代码中一般有如下几类异常:html
本节将会给出几个简单而优雅的方式来处理运行时异常和错误。java
exception对象是Throwable子类的一个实例,只在错误页面中可用。下表列出了Throwable类中一些重要的方法:程序员
序号 | 方法&描述 |
---|---|
1 | public String getMessage() 返回异常的信息。这个信息在Throwable构造函数中被初始化 |
2 | public ThrowablegetCause() 返回引发异常的缘由,类型为Throwable对象 |
3 | public String toString() 返回类名 |
4 | public void printStackTrace() 将异常栈轨迹输出至System.err |
5 | public StackTraceElement [] getStackTrace() 以栈轨迹元素数组的形式返回异常栈轨迹 |
6 | public ThrowablefillInStackTrace() 使用当前栈轨迹填充Throwable对象 |
JSP提供了可选项来为每一个JSP页面指定错误页面。不管什么时候页面抛出了异常,JSP容器都会自动地调用错误页面。数组
接下来的例子为main.jsp指定了一个错误页面。使用<%@page errorPage="XXXXX"%>指令指定一个错误页面。jsp
<%@ 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>
如今,编写ShowError.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()); %>
注意到,ShowError.jsp文件使用了<%@page isErrorPage="true"%>指令,这个指令告诉JSP编译器须要产生一个异常实例变量。spa
如今试着访问main.jsp页面,它将会产生以下结果:.net
java.lang.RuntimeException: Error condition!!! ...... Opps... Sorry, an error occurred. Here is the exception stack trace:
能够利用JSTL标签来编写错误页面ShowError.jsp。这个例子中的代码与上例代码的逻辑几乎同样,可是本例的代码有更好的结构,而且可以提供更多信息:code
<%@ 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>
运行结果以下:htm
若是您想要将异常处理放在一个页面中,而且对不一样的异常进行不一样的处理,那么您就须要使用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,它将会产生以下结果:
An exception occurred: / by zero