发布于 2015-08-17 14:49:06 | 242 次阅读 | 评论: 0 | 来源: 网络整理
当写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标记来写一个错误页面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...
|
如果要处理错误在同一个页面,并希望借此来代替触发一个错误页面的一些动作,在 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