- JSP 基础教程
- JSP - 首页
- JSP - 概述
- JSP - 环境设置
- JSP - 架构
- JSP - 生命周期
- JSP - 语法
- JSP - 指令
- JSP - 动作
- JSP - 隐式对象
- JSP - 客户端请求
- JSP - 服务器响应
- JSP - HTTP 状态码
- JSP - 表单处理
- JSP - 编写过滤器
- JSP - Cookie 处理
- JSP - 会话跟踪
- JSP - 文件上传
- JSP - 日期处理
- JSP - 页面重定向
- JSP - 点击计数器
- JSP - 自动刷新
- JSP - 发送邮件
- 高级 JSP 教程
- JSP - 标准标签库
- JSP - 数据库访问
- JSP - XML 数据
- JSP - Java Bean
- JSP - 自定义标签
- JSP - 表达式语言
- JSP - 异常处理
- JSP - 调试
- JSP - 安全性
- JSP - 国际化
- JSP 有用资源
- JSP - 问答
- JSP - 快速指南
- JSP - 有用资源
- JSP - 讨论
JSP - 异常处理
本章将讨论如何在JSP中处理异常。编写JSP代码时,可能会出现编码错误,这些错误可能出现在代码的任何部分。JSP代码中可能会出现以下类型的错误:
已检查异常
已检查异常是一种通常是用户错误或程序员无法预见的问题的异常。例如,如果要打开一个文件,但找不到该文件,则会发生异常。这些异常在编译时不能简单地忽略。
运行时异常
运行时异常是程序员可能本来可以避免的异常。与已检查异常相反,运行时异常在编译时会被忽略。
错误
这些根本不是异常,而是超出用户或程序员控制范围的问题。错误通常在您的代码中被忽略,因为您很少能对错误做些什么。例如,如果发生堆栈溢出,则会发生错误。它们在编译时也会被忽略。
我们将进一步讨论处理JSP代码中发生的运行时异常/错误的方法。
使用异常对象
异常对象是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容器都会自动调用错误页面。
以下是如何为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,您将收到类似于以下的输出:
java.lang.RuntimeException: Error condition!!! ...... Opps... Sorry, an error occurred. Here is the exception stack trace:
使用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,将生成以下内容:
Opps...
Error:
java.lang.RuntimeException: Error condition!!!
URI:
/main.jsp
Status code:
500
Stack trace:
org.apache.jsp.main_jsp._jspService(main_jsp.java:65)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
使用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,它应该生成类似于以下的输出:
An exception occurred: / by zero