论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> JAVA认证 >> IT正文
EJB最佳实践:构建更好的异常处理框架
 作者:佚名     2007-3-14 16:49:06        来源:不详  浏览次数:

 

 

 

 

 

 

 

 

嵌套的异常

在设计可靠的异常处理方案时,要考虑的第一件事情就是对所谓的 低级或 系统级异常进行抽象化。这些核心 Java 异常通常会报告网络流量中的错误、JNDI 或 RMI 问题,或者是应用程序中的其它技术问题。 RemoteException 、 EJBException 和 NamingException 是企业 Java 编程中低级异常的常见例子。

这些异常完全没有任何意义,由 Web 层的客户机接收时尤其容易混淆。如果客户机调用 purchase() 并接收到 NamingException ,那么它在解决这个异常时会一筹莫展。同时,应用程序代码可能需要访问这些异常中的信息,因此不能轻易地抛弃或忽略它们。

答案是提供一类更有用的异常,它还包含低级异常。清单 1 演示了一个专为这一点设计的简单 ApplicationException :

清单 1. 嵌套的异常

package com.ibm;
import java.io.PrintStream;
import java.io.PrintWriter;
public class ApplicationException
extends Exception
{
       /** A wrapped Throwable */
       protected Throwable cause;
       public ApplicationException()
	   {
 super("Error occurred in application.");
       }
       public ApplicationException
	   (String message) 
	   {
           super(message);
       }
       public ApplicationException
	   (String message, Throwable cause)
	   {
           super(message);
           this.cause = cause;
       }
       // Created to match the 
	   JDK 1.4 Throwable method.
       public Throwable 
	   initCause(Throwable cause)
	   {
           this.cause = cause;
           return cause;
       }
       public String getMessage()
	   {
           // Get this exception's message.
           String msg = super.getMessage();
           Throwable parent = this;
           Throwable child;
           // Look for nested exceptions.
while((child = 
getNestedException(parent)) != null)
{
   // Get the child's message.
    String msg2 = child.getMessage();
   // If we found a message 
   for the child exception, 
   // we append it.
  if (msg2 != null) 
  {
  if (msg != null)
  {
   msg += ": " + msg2;
     } 
	 else
	 {
   msg = msg2;
     }
               }
// Any nested ApplicationException 
will append its own
 // children, so we need to 
 break out of here.
if (child instanceof 
ApplicationException)
{
  break;
 }
parent = child;
           }
// Return the completed message.
return msg;
  }
public void printStackTrace()
{
// Print the stack trace 
for this exception.

super.printStackTrace();
     Throwable parent = this;
   Throwable child;
 // Print the stack trace for 
 each nested exception.
while((child = getNestedException
(parent)) != null) 
{
 
if (child != null)
{
System.err.print("Caused by: ");
  child.printStackTrace();
     
if (child instanceof ApplicationException)
{
     
break;
    
}
                   parent = child;
               }
           }
       }
  
public void printStackTrace(PrintStream s)
{
 
 // Print the stack trace for this exception.
           super.printStackTrace(s);
           Throwable parent = this;
           Throwable child;
           // Print the stack trace
		   for each nested exception.
  while((child = getNestedException
  (parent)) != null)
  {
               if (child != null)
			   {
                   s.print("Caused by: ");
                   child.printStackTrace(s);
                   if (child instanceof
				   ApplicationException)
				   {
                       break;
                   }
                   parent = child;
               }
           }
       }
       public void printStackTrace(PrintWriter w)
	   {
           // Print the stack trace
		   for this exception.
           super.printStackTrace(w);
           Throwable parent = this;
           Throwable child;
           // Print the stack trace for
		   each nested exception.
           while((child = 
		   getNestedException(parent)) != null)
		   {
               if (child != null) 
			   {
                   w.print("Caused by: ");
                   child.printStackTrace(w);
                   if (child instanceof 
				   ApplicationException)
				   {
                       break;
                   }
                   parent = child;
               }
           }
       }
       public Throwable getCause() 
	   {
           return cause;
       }
}

清单1中的代码很简单;我们已经简单地将多个异常“串”在一起,以创建单个、嵌套的异常。但是,真正的好处在于将这种技术作为出发点,以创建特定于应用程序的异常层次结构。异常层次结构将允许 EJB 客户机既接收特定于业务的异常也接收特定于系统的信息,而不需要编写大量额外代码。

异常层次结构

异常层次结构应该从一些十分健壮而又通用的异常入手,如 ApplicationException 。如果您将顶级异常搞得太具体,那么其结果是您今后将不得不重新构造层次结构,以适应某些较通用的情况。

因此,让我们假定您的应用程序要求 NoSuchBookException 、 InsufficientFundsException 和 SystemUnavailableException 。您不必创建这三个异常,让它们继承 ApplicationException ,然后只需提供极少几个必须的构造器来创建格式化的消息。清单 2 是此类异常层次结构的示例:

清单 2. 异常层次结构

package com.ibm.library;
import com.ibm.ApplicationException;
public class NoSuchBookException
extends ApplicationException
{
       public NoSuchBookException
	   (String bookName, String libraryName)
	   {
        super("The book '" + bookName
		+ "' was not found in the '" +
            libraryName + "' library.");
    }
}

当需要编写大量专用异常时,异常层次结构极大地简化了工作。对于一个异常,为每个异常类添加一个或两个构造器,所花费时间很少不超过几分钟。您还经常需要给这些更具体的异常(这些异常也是主应用程序异常的子类)提供子类,以提供更具体的异常。例如,您可能需要 InvalidTitleException 和 BackorderedException 来继承 NoSuchBookException 。

企业应用程序在构建时通常都不会注意异常处理。尽管依靠低级异常(如 RemoteException 和 NamingException )很容易(有时也很诱人),但如果一开始就建立一个可靠的、深思熟虑的异常模型,则您将在应用程序上少花很多精力。创建一个嵌套的、层次结构化的异常框架将改进代码的可读性及其可用性。

(T117)


责任编辑:lss
  相关新闻
Java基础-漫谈EJB在Java中的应用
漫谈EJB在Java中的应用(二)
CCIE-LAB最新IOS12.3T版官方介绍
J2EE技术-漫谈EJB在Java中的应用
重造Java ESB:细述JBI与ServiceMix
把JBoss缓存用作POJO缓存的实战演练
浅析Spring与EJB 3.0之酸甜苦辣
谈一谈如何使用EJB的提供程序
EJB 3.0 的新规范概览及其未来发展
Tutorial for building J2EE Applications using JBOS
CCIE-LAB最新IOS12.3T版官方介绍
Java基础-漫谈EJB在Java中的应用
漫谈EJB在Java中的应用(二)
浅析Spring与EJB 3.0之酸甜苦辣
把JBoss缓存用作POJO缓存的实战演练
JDO、EJB/CMP、Hibernate和Amber比较
Jbuilder配置mssqlserver2000  JDBC过程
JBOSS4.0 JDBC数据源配置大全(一)
Jboss的JDBC数据源配置步骤详解大全
JBuilder+WebService之实战分析
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号