在本章中.我们将讨论如何处理JSP中的异常.在编写JSP代码时,可能会在代码的任何部分发生编码错误. JSP代码中可能会出现以下类型的错误 :
已检查的异常是一个异常,通常是用户错误或程序员无法预见的问题.例如,如果要打开文件,但找不到该文件,则会发生异常.在编译时不能简单地忽略这些异常.
运行时异常是一个例外,可能是由程序员.与已检查的异常相反,在编译时忽略运行时异常.
这些根本不是例外,但是问题是超出了用户或程序员的控制.代码中通常会忽略错误,因为您很少对错误做任何事情.例如,如果发生堆栈溢出,则会出现错误.它们在编译时也被忽略.
我们将进一步讨论如何处理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() 返回数组c获取堆栈跟踪上的每个元素.索引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标记来编写错误页面 ShowError.jsp .此页面具有与上例相同的逻辑,具有更好的结构和更多的信息和减号;
<%@ taglib prefix = "c" uri = "https://img01.yuandaxia.cn/Content/img/tutorials/jsp/index.html" %> <%@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.jspStatus code:500Stack 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)
如果您想在同一页面内处理错误并想要采取某些操作而不是触发错误页面,您可以使用尝试.... 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