JSP - 异常处理( Exception Handling)
在这一章当中。 我们将讨论如何在JSP中处理异常。 在编写JSP代码时,可能会在代码的任何部分发生编码错误。 您的JSP代码中可能会出现以下类型的错误 -
检查异常
已检查的异常是一个异常,通常是用户错误或程序员无法预见的问题。 例如,如果要打开文件,但找不到该文件,则会发生异常。 在编译时不能简单地忽略这些异常。
运行时异常
运行时异常是程序员可能已经避免的异常。 与已检查的异常相反,在编译时忽略运行时异常。
Errors
这些都不是例外,而是超出用户或程序员控制的问题。 代码中通常会忽略错误,因为您很少对错误做任何事情。 例如,如果发生堆栈溢出,则会出现错误。 它们在编译时也被忽略。
我们将进一步讨论在JSP代码中处理运行时异常/错误的方法。
使用异常对象
异常对象是Throwable的子类的实例(例如,java.lang。NullPointerException),并且仅在错误页面中可用。 下表列出了Throwable类中可用的重要方法。
S.No. | 方法和描述 |
---|---|
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指定Error Page的选项。 每当页面抛出异常时,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,将生成以下内容 -
<h1>Opps...</h1>
Error: | java.lang.RuntimeException:错误条件!!! |
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 Block
如果您想在同一页面中处理错误并想要采取某些操作而不是触发错误页面,则可以使用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