JSP的异常处理

以下内容引用自http://wiki.jikexueyuan.com/project/jsp/exception-handling.html

当写JSP代码的时候,有可能会留下一个编码错误,并且它会出现在代码的任何一个部分。在JSP代码中会有以下类型的错误:

  • 检测异常(Checked exceptions):一个检测异常通常是一个用户错误或者是一个有程序员无法预见的错误引起的异常。例如,如果要打开一个文件,但是无法找到该文件,这时就会出现异常。这些异常在编译时不能简单的忽略掉。
  • 运行异常(Runtime exceptions):一个运行异常可能是程序员本来可以避免的一个异常。和检测异常相反,运行异常在编译时可以被忽略。
  • 错误(Errors):这原本不是异常,是超出用户或者程序员的控制而引起的问题。错误通常在代码中会被忽略,因为对一个错误能够做的很少。例如,如果一个堆栈发生溢出,那么就会出现一个错误。在编译时他们也会被忽略。

一、使用异常对象

异常对象是Throwable子类的一个实例(例如,java.lang.NullPointerException),它只能在错误页面是可用的。下面是Throwable类中可用的重要方法的列表。

方法 描述
public String getMessage()
返回发生异常的详细信息。这个消息是在Throwable构造函数里初始化的。

public Throwable getCause()
返回发生异常的原因,用一个Throwable对象表示。

public String toString()
返回与getMessage()相连接的类名。

public void printStackTrace()
输出toString()和堆栈跟踪的System.err的结果,错误输出流。

public StackTraceElement [] getStackTrace()
返回一个数组,其中包含堆栈跟踪的每一个元素。索引值为0的元素表示调用堆栈的顶部, 数组中最后一个元素在调用堆栈的底部代表方法。

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,它将会生成如下结果:

二、在错误页面使用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,它将会生成如下结果:

三、使用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,它将会生成如下结果:

测试工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test22

时间: 2024-11-05 11:26:39

JSP的异常处理的相关文章

JSP的执行过程及其异常处理机制

1.JSP的执行过程 虽然JSP感觉上很像一般的HTML网页,但事实上它是以Servlet的形式被运行的.因为JSP文件在第一次运行的时候会先解释成Servlet源文件,然后编译成Servlet类文件,最后才会被Servlet容器运行,JSP的执行过程主要可以分为以下几点: 1)客户端发出请求: 2)Web容器将JSP转译成Servlet源代码: 3)Web容器将产生的源代码进行编译: 4)Web容器加载编译后的代码并执行: 5)把执行结果响应至客户端. 2.JSP的异常处理机制 JSP中除了H

【SpringMVC学习07】SpringMVC中的统一异常处理

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.在开发中,不管是dao层.service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护.这篇博文主要总结一下SpringMVC中如何统一处理异常. 1. 异常处理思路 首先来看一下在spr

JSP/Servlet Web 学习笔记 DayThree

JSP内置对象 使用JSP语法可以存取这些内置对象来执行JSP网页的Servlet环境相互作用.内置对象其实是由特定的Java类所产生的.每一种内置对象都映射到一个特定的Java类或者端口,在服务器运行时根据情况自动生成. 下表列出了所有的JSP内置对象: 对象名 描述 作用域  分类 appliction 显示相应网页是有应用程序的对象 整个应用程序执行期间 作用域通信对象:检索JSP页面的Servlet相关信息 session 保存个人信息的个人所有对象 会话期间 pageContext 提

JSP九大内置对象详解

JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1.request对象 request 对象是 javax.servlet.httpServletRequest类型的对象. 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据.(包括头信息.系统信息.请求方式以及请求参数等).request对象的作用域为一次请求. 2.res

JSP 内置对象和域

JSP 九大内置对象简介 application 对象 1 让多个 JSPServlet 共享数据 2 获取 Web 应用配置参数 config 对象 exception 对象 out 对象 pageContext 对象 request 对象 1 获取请求参数 2 操作 request 范围的属性 3 执行 forward 或 include response 对象 1 response 响应生成非字符响应 2 重定向 3 增加 Cookie session 对象 JSP 中的四大域对象 1.

【Hibernate学习笔记】第二章节:JSP/Servlet及相关技术详解

JSP(Java Servr Page)和Servlet是Java EE规范的两个基本成员,他们是Java Web开发的重点知识,也是Java EE开发的基础知识.JSP和Servlet的本质是一样的,因此JSP最终必须编译成Servlet才能运行,或者说JSP只是生成Servlet的"草稿"文件.JSP的特点是在HTML页面中嵌入了Java代码片段,从而可以动态的提供页面内容. 1.Web应用和web.xml文件 JSP.Servlet.Listener和Filter等都必须运行在W

SpringMVC06Exception 异常处理

1.配置web.xml文件 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name>

jsp的九大内置对象(查询资料,搬砖所得)

此笔记大部分摘自大神https://www.cnblogs.com/SimonHu1993/,部分通过网上搜寻补充. 1.Request内置对象(类型:HttpServletRequest    表示一次用户请求)该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息.即使用Request内置对象可以获取用户提交的信息. 当Request内置对象获取客户提交的汉字字符时会出现乱码问题,必须进行特殊处理.首先,将获取的字符串用ISO-8859-1进行编码,并将编码存放到一个字节数组

115个Java面试题和答案——终极列表(下)

第一篇讨论了面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,本章主要讨论异常处理,Java小应用程序,Swing,JDBC,远程方法调用(RMI),Servlet和JSP. 异常处理 43.Java中的两种异常类型是什么?他们有什么区别? Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常.不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方