`
sunxboy
  • 浏览: 2870384 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java异常框架设计(转)

阅读更多

什么是异常?
异常(exception)应该是异常事件(exceptional event)的缩写。
异常定义:异常是一个在程序执行期间发生的事件,它中断正在执行的程序的正常的指令流。

当在一个方法中发生错误的时候,这个方法创建一个对象,并且把它传递给运行时系统。这个对象被叫做异常对象,它包含了有关错误的信息,这些信息包括错误的类型和在程序发生错误时的状态。创建一个错误对象并把它传递给运行时系统被叫做抛出异常。

一个方法抛出异常后,运行时系统就会试着查找一些方法来处理它。这些处理异常的可能的方法的集合是被整理在一起的方法列表,这些方法能够被发生错误的方法调用。这个方法列表被叫做堆栈调用(call stack)

运行时系统搜寻包含能够处理异常的代码块的方法所请求的堆栈。这个代码块叫做异常处理器,搜寻首先从发生的方法开始,然后依次按着调用方法的倒序检索调用堆栈。当找到一个相应的处理器时,运行时系统就把异常传递给这个处理器。

一个异常处理器要适当地考滤抛出的异常对象的类型和异常处理器所处理的异常的类型是否匹配。异常被捕获以后,异常处理器关闭。如果运行时系统搜寻了这个方法的所有的调用堆栈,而没有找到相应的异常处理器。 

怎么设计异常框架

任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个字类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。典型的简易 程序不捕获或抛出Errors对象,你可能永远不会遇到需要实例化Error的应用,那就让我们关心一下Exception

Exception中比较重要的就是RuntimeException-运行时异常(当然这个名字是存在争议的,因为任何的异常都只会发生在运行时),为什么说这个类时很重要的呢?因为它直接关系到你的异常框架的设计,仔细看RuntimeException

A method is not required to declare in its throws clause any subclasses of RuntimeException that might be thrown during the execution of the method but not caught.

-可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。

也就是说你的应用应该不去“关心”(说不关心是不服责任的,但只是你不应该试图实例化它的字类)RuntimeException,就如同你不应该 关心Error的产生与处理一样!RuntimeException描述的是程序的错误引起来的,因该由程序负担这个责任!(从责任这个角度看Error 属于JVM需要负担的责任;RuntimeException是程序应该负担的责任;checked exception 是具体应用负担的责任)

那就有人会问,那我该关心什么!答案就是除了Error与RuntimeException,其他剩下的异常都是你需要关心的,而这些异常类统称为 Checked Exception,至于Error与RuntimeException则被统称为Unchecked Exception.


异常的概念就这些了,即使你在网络上搜索也就不过如此,是不是感觉到有点清晰又有点模糊?那么怎么该如何在这样单薄而模糊的概念下设计J2EE的异常框架呢?

 

解决方案:J2EE异常框架

我们拿一个模拟的例子来说明异常框架的设计过程,比如我们要对外提供doBusiness()这个业务方法

public void doBusiness() throws xxxBusinessException

当客户端调用这样的方法的时候应该这样处理异常(包括处理RuntimeException , checked exception)
记住,无论如何我们都不希望或者确切的说是不应该将RuntimeException这样的异常暴露给客户的,因为他们没有解决这个问题的责任!
我们暂时将Struts中的某个Action看作时客户端,其中doExecute(....)要调用doBusiness()这个方法


public void doAction(......)
{
 try
 {

  xxx.doBusiness();
 }
 catch(Exception e)
 {
   if(e instanceof RuntimeException) 
   {
    // catch runtime exception
    // 你可以在这里将捕获到的RuntimeException
    // 将异常通知给某个负责此程序的程序员,让他知道他
    // 自己犯了多么低级的错误!


   }else
   {
    //checked exception such as xxxBusinessException
    //将这样的异常暴露给客户显示   

   }

 }
}
 

我们可以这样设计xxxBusinessException


public class xxxBusinessException extends ApplicationException
{
    public xxxBusinessException(String s){
        super(s);

};

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;
       }
}
 

而"聪明"的读者肯定要问我那doBusiness()这个业务方法该如何包装异常呢?


public void doBusiness() throw xxxBusinessException
 {
   try
   {
     execute1(); // if it throw exception1

     exexute2(); // if it throw exception 2

     .... .....

   }
   catch (exception1 e1)
   {
    throw new xxxBusinessException(e1);
   }
   catch(exception2 e2)
   {
    throw new xxxBusinessException(e2);
   }
   ........
 }

 也可以这样

 public void doBusiness() throw xxxBusinessException
 {
   try
   {
     execute1(); // if it throw exception1

     exexute2(); // if it throw exception 2

     .... .....

   }
   catch (Exception e)
   {
    // 注意很多应用在这里根本不判断异常的类型而一股脑的采用
    // throw new xxxBusinessException(e);
    // 而这样带来的问题就是xxxBusinessException"吞掉了"RuntimeException
    // 从而将checked excption 与unchecked exception混在了一起!

    // 其实xxxBusinessException属于checked excpetion ,它根本不应该也不能够理睬RuntimeException
    if(! e instanceof RuntimeException) throw new xxxBusinessException(e);
   }
 }

 
总结
 1。JAVA的异常分为两类: checked exception & unchecked excpetion
 2。应用开发中产生的异常都应该集成自Exception 但都属于checked excpetion类型
 3。应用中的每一层在包装并传递异常的时候要过滤掉RuntimeException!
 4。从责任这个角度看Error属于JVM需要负担的责任;RuntimeException是程序应该负担的责任;checked exception 是具体应用负担的责任
 5。无论如何我们都不希望或者确切的说是不应该将RuntimeException这样的异常暴露给客户的,因为他们没有解决这个问题的责任!

 

分享到:
评论

相关推荐

    Java异常框架设计

    这篇博文“Java异常框架设计”可能探讨了如何有效地利用Java的异常处理机制来构建可靠的系统。在这个讨论中,我们将深入理解Java异常的基本概念、异常分类、以及如何通过良好的框架设计提升代码的可读性和可维护性。...

    高效的java异常处理框架高效的java异常处理框架高效的java异常处理框架

    Java 异常的基本概念和语法开始,讲述 Java 异常处理的基本知识,分析 Java 异常体系结构,对比 Spring 的异常处理框架,阐述异常处理的基本原则,并提出了自己处理一个大型应用系统异常的思想,并通过设计一个异常...

    java 异常框架CODE

    Java异常框架是Java编程语言中处理程序运行时错误和异常的核心机制。在Java中,异常是一种特殊的对象,用于表示程序运行过程中的不正常状态。Java的异常处理模型基于\"异常处理块\",包括try、catch、finally和throw...

    java异常框架处理.pdf

    总结来说,Java异常框架处理涉及的知识点包括异常类的层次结构、运行时异常与检查型异常的区别、异常处理结构(try-catch-finally)、自定义异常的设计与使用、第三方库异常的处理以及异常处理关键字的使用。...

    java异常机制小结

    Java 语言在设计的当初就考虑到异常处理的框架的方案,使得所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常。Java 异常机制的基础知识包括异常的基础概念、异常的分类、异常的对象、异常的来源...

    深入探索高效的Java异常处理框架

    理解异常的分类和处理机制,结合适当的框架设计,可以构建出高效且易于维护的异常处理系统。在编写代码时,应尽量预见并预防可能出现的异常,使用合适的异常类型,避免过于宽泛的catch块,以及充分利用finally块进行...

    JAVA-CS快速开发框架设计文档

    【JAVA-CS快速开发框架设计文档】是一份详细指导JAVA开发者在无IDE环境下构建高效开发框架的资料,旨在帮助程序员在不依赖特定集成开发环境的情况下,实现界面设计与事件代码的动态开发。这份文档可能涵盖了从基础...

    Java平台统一异常框架归类.pdf

    总的来说,Java平台的统一异常框架设计旨在提供一个健壮、稳定且易于使用的异常处理机制,它通过异常的层次结构、国际化和拦截器,有效地管理和呈现应用程序可能出现的各种异常情况,提高了系统的可维护性和用户体验...

    Java SSH 框架整合,学习源码

    2. **Struts框架**:Struts是基于MVC(Model-View-Controller)设计模式的Java Web应用框架,用于处理用户请求和业务逻辑。在SSH整合中,Struts主要负责接收HTTP请求,转发到相应的Action,然后调用Service层处理...

    Java框架API大全.rar

    最后,Struts是基于MVC(Model-View-Controller)设计模式的Java Web框架,用于组织和控制应用的业务逻辑。Struts 2框架整合了其他开源项目,如FreeMarker和Tiles,提供了更丰富的视图渲染能力。通过Action、...

    基于AOP的Java异常处理框架和工具的分析与设计.pdf

    "基于AOP的Java异常处理框架和工具的分析与设计" 本文主要探讨了基于AOP(Aspect-Oriented Programming,面向方面编程)的Java异常处理框架和工具的分析与设计。 异常处理机制是当前软件系统的重要组成部分,被大...

    自定义Java开发框架

    3. **依赖注入(DI)与控制反转(IoC)**:这是Java框架中常见的设计原则,通过容器管理对象间的依赖关系,解耦组件,提高代码的灵活性和可测试性。Spring框架的依赖注入是其中的典型代表。 4. **AOP(面向切面编程...

    JAVA SMART系统-系统框架设计与开发(源代码+文档).zip

    "JAVA SMART系统-系统框架设计与开发(源代码+文档).zip" 是一个包含Java智能系统框架设计与开发的相关资源的压缩包。这个压缩包很可能是一个教学或实践项目,提供了完整的源代码和相关文档,帮助学习者理解并研究...

    java迷你框架附使用例程

    10. **异常处理**:框架可能会提供统一的异常处理机制,便于开发者对错误进行集中管理和报告。 11. **测试支持**:为了促进单元测试和集成测试,迷你框架可能包含了测试工具和辅助类,帮助开发者编写和运行测试。 ...

    Java异常处理机制应用研究.pdf

    本文将详细介绍 Java 异常处理机制的应用研究,包括 Java 异常体系统结构、异常分类与处理机制、异常处理的一般原则和异常处理框架等。 Java 异常体系统结构 Java 异常体系统结构如图 1 所示,Throwable 是所有...

    java 框架论坛系统

    对于Java初学者而言,学习并实践Struts框架能够帮助他们更好地理解Web应用的架构设计,提升开发技能。 首先,我们来深入了解一下Struts框架的核心概念。Struts框架提供了一种结构化的方式来组织Java Web应用程序,...

    java数据库框架技术研究

    在Java开发中,数据库框架是不可或缺的一部分,它们简化了数据访问层(DAL)的实现,提高了开发效率。...但对于小型项目或学习实践,这样的自定义框架是一个很好的学习和理解数据库操作框架设计的好途径。

    自考Java程序设计真题

    本资源摘要信息总结了Java程序设计的真题集锦,涵盖了Java程序设计的各个方面,包括Java基础知识、Java数组、Java GUI编程、Java事件处理、Java集合框架、Java文件输入输出、Java异常处理、Java多线程编程、Java网络...

    Javaee三大框架课程设计

    JavaEE三大框架,即Struts2、Spring和Hibernate,是Java企业级开发中的核心组件,广泛应用于构建高效、可维护的Web应用。本课程设计旨在深入理解和熟练掌握这三大框架的集成与应用。 首先,Struts2是MVC(Model-...

Global site tag (gtag.js) - Google Analytics