JSP异常处理
在这一章。 我们将讨论如何处理JSP中的异常。当编写JSP代码时,可能会导致代码错误发生在代码的任何部分。JSP代码中可能会出现以下类型的错误 -
检查异常
检查异常是一个例外,通常是用户错误或程序员无法预见的问题。 例如,如果要打开文件,但找不到文件,则会发生异常。编译时不能简单地忽略这些异常。
运行时异常
运行时异常是程序员可能避免的一种例外。与检查异常相反,运行时异常在并发时被忽略。
错误
错误并不是例外,而是出现在用户或程序员控制之外的问题。代码中通常会忽略错误,因为很少会对错误做任何事情。例如,如果发生堆栈溢出,则会出现错误。编译时也会被忽略。
下面我们将进一步讨论如何处理JSP代码中出现的运行时异常/错误。
使用Exception对象
Exception
对象是Throwable
子类的一个实例(例如,java.lang.NullPointerException
),仅在错误页面中可用。下表列出了Throwable
类中可用的重要方法。
编号 | 方法 | 描述 |
---|---|---|
1 | public String getMessage() |
返回有关发生的异常的详细消息。此消息在Throwable 构造函数中初始化。 |
2 | public Throwable getCause() |
返回由Throwable 对象表示的异常的原因。 |
3 | public String toString() |
返回与getMessage() 的结果连接的类的名称。 |
4 | public void printStackTrace() |
将toString() 的结果与堆栈跟踪一起打印到System.err 错误输出流。 |
5 | public StackTraceElement [] getStackTrace() |
返回一个包含堆栈跟踪中每个元素的数组。索引0 处的元素表示调用堆栈的顶部,数组中的最后一个元素表示调用堆栈底部的方法。 |
6 | public Throwable fillInStackTrace() |
使用当前堆栈跟踪填充Throwable 对象的堆栈跟踪,添加堆栈跟踪中的任何先前信息。 |
JSP提供了一个选项用来为每个JSP指定错误页面。每当页面引发异常时,JSP容器将自动调用错误页面。
以下是一个示例来指定index.jsp
的错误页面。要设置错误页面,请使用<%@ page errorPage =“xxx”%>
指令。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page errorPage="ErrorPage.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>错误页面示例</title> </head> <body> <% // Throw an exception to invoke the error page int x = 1; if (x == 1) { throw new RuntimeException("Error condition!!!"); } %> </body> </html>
现在编写一个错误处理ErrorPage.jsp
,如下所示。 请注意,错误处理页面包含指令<%@ page isErrorPage =“true”%>
。 该指令使JSP编译器生成异常实例变量。
文件:**
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page isErrorPage="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>错误显示页面</title> </head> <body> <h2>错误显示页面...</h2> <p>Sorry, an error occurred.</p> <p>Here is the exception stack trace:</p> <pre> <% exception.printStackTrace(response.getWriter()); %> </pre> </body> </html>
访问index.jsp
,将收到一个类似于以下内容的输出 -
使用JSTL标签编写错误页面
可以使用JSTL标签来编写错误页面ErrorPage2.jsp
。 该页面具有与上述示例中具有差不多相同的逻辑,具有更好的结构和更多信息 -
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@page isErrorPage="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>错误显示页面</title> </head> <body> <h2>错误显示页面...</h2> <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>
访问index.jsp
,将收到一个类似于以下内容的输出 -
使用try…catch块
如果要处理同一页面中的错误,并希望采取一些措施,而不是触发错误页面,则可以使用try....catch
块。
以下是一个简单的例子,显示如何使用try...catch
块。把下面的代码放在try-catch.jsp
中 -
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Try...Catch示例</title> </head> <body> <div style="margin: auto; width: 90%"> <% try { int i = 1; i = i / 0; out.println("The answer is " + i); } catch (Exception e) { out.println("An exception occurred: " + e.getMessage()); } %> </div> </body> </html>
访问http://localhost:8080/ExceptionHandling/try-catch.jsp
,它应该生成一个类似于以下内容的输出 -
An exception occurred: / by zero
上一篇:JSP表达式语言(EL)
下一篇:JSP调试方法
- Java教程
- Vim教程
- Swing教程
- Spring教程
- Spring Web Services教程
- Spring MVC教程
- Spring JDBC教程
- Spring Cloud教程
- Spring Boot教程
- Spring Boot CLI教程
- Spring Batch教程
- Spring AOP教程
- PDFBox教程
- JSP教程
- JSF教程
- JPA教程
- Java面向对象设计
- Java设计模式
- Java虚拟机教程
- Java泛型教程
- Java正则表达式教程
- Java数据类型教程
- Java并发编程教程
- Java密码学教程
- Java多线程教程
- Java国际化(i18n)教程
- JavaFX教程
- Java9教程
扫描二维码
程序员编程王