橘子味的心
标题: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”%>指令。

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page errorPage="ErrorPage.jsp"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>错误页面示例</title>
  9. </head>
  10. <body>
  11. <%
  12. // Throw an exception to invoke the error page
  13. int x = 1;
  14.  
  15. if (x == 1) {
  16. throw new RuntimeException("Error condition!!!");
  17. }
  18. %>
  19. </body>
  20. </html>
  21. HTML

现在编写一个错误处理ErrorPage.jsp,如下所示。 请注意,错误处理页面包含指令<%@ page isErrorPage =“true”%>。 该指令使JSP编译器生成异常实例变量。

文件:**

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page isErrorPage="true"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>错误显示页面</title>
  9. </head>
  10. <body>
  11. <h2>错误显示页面...</h2>
  12. <p>Sorry, an error occurred.</p>
  13. <p>Here is the exception stack trace:</p>
  14. <pre>
  15. <%
  16. exception.printStackTrace(response.getWriter());
  17. %>
  18. </pre>
  19. </body>
  20. </html>
  21. HTML

访问index.jsp,将收到一个类似于以下内容的输出 -

使用JSTL标签编写错误页面

可以使用JSTL标签来编写错误页面ErrorPage2.jsp。 该页面具有与上述示例中具有差不多相同的逻辑,具有更好的结构和更多信息 -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  4. <%@page isErrorPage="true"%>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  9. <title>错误显示页面</title>
  10. </head>
  11. <body>
  12. <h2>错误显示页面...</h2>
  13. <table width="100%" border="1">
  14. <tr valign="top">
  15. <td width="40%"><b>Error:</b></td>
  16. <td>${pageContext.exception}</td>
  17. </tr>
  18.  
  19. <tr valign="top">
  20. <td><b>URI:</b></td>
  21. <td>${pageContext.errorData.requestURI}</td>
  22. </tr>
  23.  
  24. <tr valign="top">
  25. <td><b>Status code:</b></td>
  26. <td>${pageContext.errorData.statusCode}</td>
  27. </tr>
  28.  
  29. <tr valign="top">
  30. <td><b>Stack trace:</b></td>
  31. <td><c:forEach var="trace"
  32. items="${pageContext.exception.stackTrace}">
  33. <p>${trace}</p>
  34. </c:forEach></td>
  35. </tr>
  36. </table>
  37. </body>
  38. </html>
  39. HTML

访问index.jsp,将收到一个类似于以下内容的输出 -

使用try…catch块

如果要处理同一页面中的错误,并希望采取一些措施,而不是触发错误页面,则可以使用try....catch块。

以下是一个简单的例子,显示如何使用try...catch块。把下面的代码放在try-catch.jsp中 -

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Try...Catch示例</title>
  8. </head>
  9. <body>
  10. <div style="margin: auto; width: 90%">
  11. <%
  12. try {
  13. int i = 1;
  14. i = i / 0;
  15. out.println("The answer is " + i);
  16. } catch (Exception e) {
  17. out.println("An exception occurred: " + e.getMessage());
  18. }
  19. %>
  20. </div>
  21. </body>
  22. </html>
  23. HTML

访问http://localhost:8080/ExceptionHandling/try-catch.jsp,它应该生成一个类似于以下内容的输出 -

An exception occurred: / by zero