文档章节

JSP 异常处理

村长杨京京
 村长杨京京
发布于 2015/02/15 11:31
字数 1031
阅读 169
收藏 13

JSP 异常处理

当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方。JSP代码中通常有以下几类异常:

  • 检查型异常:检查型异常就是一个典型的用户错误或者一个程序员无法预见的错误。举例来说,如果一个文件将要被打开,但是无法找到这个文件,则一个异常被抛出。这些异常不能再编译期被简单地忽略。
  • 运行时异常:一个运行时异常可能已经被程序员避免,这种异常在编译期将会被忽略。
  • 错误:错误不是异常,但问题是它超出了用户或者程序员的控制范围。错误通常会在代码中被忽略,您几乎不能拿它怎么样。举例来说,栈溢出错误。这些错误都会在编译期被忽略。

本节将会给出几个简单而优雅的方式来处理运行时异常和错误。

使用Exception对象

exception对象是Throwable子类的一个实例,只在错误页面中可用。下表列出了Throwable类中一些重要的方法:

序号 方法&描述
1 public String getMessage()

 

返回异常的信息。这个信息在Throwable构造函数中被初始化
2 public ThrowablegetCause()

 

返回引起异常的原因,类型为Throwable对象
3 public String toString()

 

返回类名
4 public void printStackTrace()

 

将异常栈轨迹输出至System.err
5 public StackTraceElement [] getStackTrace()

 

以栈轨迹元素数组的形式返回异常栈轨迹
6 public ThrowablefillInStackTrace()

 

使用当前栈轨迹填充Throwable对象

JSP提供了可选项来为每个JSP页面指定错误页面。无论何时页面抛出了异常,JSP容器都会自动地调用错误页面。

接下来的例子为main.jsp指定了一个错误页面。使用<%@page errorPage="XXXXX"%>指令指定一个错误页面。

<%@ 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>

现在,编写ShowError.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()); %>

注意到,ShowError.jsp文件使用了<%@page isErrorPage="true"%>指令,这个指令告诉JSP编译器需要产生一个异常实例变量。

现在试着访问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>

运行结果如下:

jsp-exeception-1

使用 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

© 著作权归作者所有

村长杨京京
粉丝 161
博文 878
码字总数 907544
作品 0
杭州
程序员
私信 提问
加载中

评论(2)

liefeng
liefeng
为什么不直接用lisp而要使用方言呢?
车开源
车开源
为毛我一直无法接受这样你写法
StandardWrapperValve分析-tomcat6.x源码阅读

2013-11-10 StandardWrapperValve是StandardWrapper容器的BasicValve,tomcat使用容器的BasicValve来控制处理请求,StandardWrapperValve的作用是负责为请求选择Wrapper,调用Servlet处理请求...

douglaswei
2013/11/19
84
0
(JavaEE-07)JSP.md

JSP JSP全称是Java Server Pages,它和Servlet技术一样,都是SUN公司定义的一种用于开发动态Web资源的技术。JSP的编写就像编写HTML一样简单,但是与HTML不同的是,在JSP中,可以编写Java代码...

_-Leon-_
2014/07/04
109
0
servlet 异常处理的另一个思路

我最近在写一个小小的servlet小网站,我在网上看到一些人写得关于servlet异常处理的方法,一种很常见的方法就是在servlet里面用try块包围指定的方法,在catch块里重定向到错误页 比如 可是这...

J-will
2011/09/03
1K
4
JSP 学习总结---学习笔记

什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的对象 HttpServletResponse表示服务端到客户端的...

知止内明
2018/04/18
0
0
SpringFramework之学习javax.servlet.Servlet

注:在阅读下文前,建议先去查看JCP的Servlet规范。 1.先来看Servlet接口中定义的方法 图1 Servlet接口中定义的方法 Servlet life cycle:每个Servlet都会经历初始化、接收请求、终止服务,分...

汉斯-冯-拉特
2018/07/26
10
0

没有更多内容

加载失败,请刷新页面

加载更多

米联客(MSXBO) 基于VIVADO实现FPGA时序笔记之概述(一)

FPGA时序要满足要求,这个基本原理大家基本都知道,但是如何使用VIVADO IDE工具进行时序设计、时序分析、判断时序是否满足要求,这个对很多FPGA工程师来说,还是比较抽象,因为时序分析的工具...

msxbo
23分钟前
4
0
Centos7 命令行下kvm安装windows,linux

查看是否支持 egrep "svm|vmx" /proc/cpuinfo |uniq 安装软件 yum install libvirt -yyum -y install qemu-kvmsystemctl enable libvirtd && systemctl start libvirtd# 启动lib......

以谁为师
24分钟前
4
0
源码分析 RocketMQ DLedger(多副本) 之日志追加流程

上一篇我们详细分析了源码分析 RocketMQ DLedger 多副本之 Leader 选主,本文将详细分析日志复制的实现。 根据 raft 协议可知,当整个集群完成 Leader 选主后,集群中的主节点就可以接受客户...

中间件兴趣圈
37分钟前
3
0
基于k8s的Ingress部署hexo博客(http和https)

注:kuberntes版本为1.15 什么是 Ingress Ingress 是一个提供对外服务的路由和负载均衡器,其本质是个nginx控制器服务。 k8s文档上Ingress经典数据链路图: internet | [ In...

Kanonpy
56分钟前
7
0
LNMP---访问控制

访问控制 扩展: curl命令用法: curl -v -A 'aaaaaspider/3.0' -e "1111" -x127.0.0.1:80 discuz.tobe.com -I -A 指定user-agent -e 指定referer -x 指定访问目标服务器的ip和por......

tobej
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部