位置:首页 > > JSP异常处理

JSP异常处理

当写JSP代码,程序员可能会留下它可以发生在任何部分代码的编码错误。有以下的错误类型在JSP代码:

  • 检查异常: 检查异常是一个例外,通常是用户错误或不能由程序员不可预见的问题。例如,如果一个文件被打开,但该文件无法找到,则会出现异常。这些例外并不能简单地在编译时被忽略。

  • 运行时异常: 运行时异常是发生,大概本来是可以由编程人员避免异常。而不是检查异常,运行时异常是在编译时忽略不计。

  • 错误: 这些都不是例外,但所出现超出用户或程序员的控制问题。错误通常忽略了代码,因为你可以减少做有关的错误。例如,如果发生堆栈溢出时,会产生一个错误。但在编译的时候还是被忽略了。

本教程会给你一些简单而优雅的方式来处理运行时产生在JSP代码异常/错误。

使用异常对象:

异常对象是可抛出(例如,java.lang. NullPointerException)的一个子类的实例,并仅在错误页面使用。以下是在Throwable类中提供重要方法列表。

SN 方法和描述
1 public String getMessage()
Returns a detailed message about the exception that has occurred. This message is initialized in the Throwable constructor.
2 public Throwable getCause()
Returns the cause of the exception as represented by a Throwable object.
3 public String toString()
Returns the name of the class concatenated with the result of getMessage()
4 public void printStackTrace()
Prints the result of toString() along with the stack trace to System.err, the error output stream.
5 public StackTraceElement [] getStackTrace()
Returns an array containing each element on the stack trace. The element at index 0 represents the top of the call stack, and the last element in the array represents the method at the bottom of the call stack.
6 public Throwable fillInStackTrace()
Fills the stack trace of this Throwable object with the current stack trace, adding to any previous information in the stack trace.

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