`

Java异常处理原则

    博客分类:
  • java
阅读更多

J2EE系统异常的处理准则


2009-12-15 21:41:41
 标签:J2EE Exception   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/244138
J2EE系统异常的处理准则
 
异常的处理是每个Java程序员时常面对的问题,但是很多人没有原则,遇到异常也不知道如何去处理,于是遇到检查异常就胡乱try...catch...一把,然后e.printStackTrace()一下了事,这种做法通常除了调试排错有点作用外,没任何价值。对于运行时异常,则干脆置之不理。
 
原因是很多开发者缺乏对异常的认识和分析,首先应该明白Java异常体系结构,一种分层继承的关系,你必须对层次结构熟烂于心:
Throwable(必须检查)
                    Error(非必须检查)
                    Exception(必须检查)
                                    RuntimeException(非必须检查)
 
一般把Exception异常及其直接子类(除了RuntimeException之外)的异常称之为检查异常。把RuntimeException以及其子类的异常称之为非检查异常,也叫运行时异常。
对于Throwable和Error,则用的很少,一般会用在一些基础框架中,这里不做讨论。
 
下面针对J2EE的分层架构:DAO层、业务层、控制层、展示层的异常处理做个分析,并给出一般处理准则。
 
一、DAO层异常处理
 
如果你用了Spring的DAO模板来实现,则DAO层没有检查异常抛出,代码非常的优雅。但是,如果你的DAO采用了原始的JDBC来写,这时候,你不能不对异常做处理了,因为难以避免的SQLException会如影随形的跟着你。对已这种DAO级别的异常,异常了你又能如何呢?与其这样胡乱try...catch...,囫囵吞枣消灭了异常不如让异常以另外一种非检查的方式向外传递。这样做好处有二:
1)、DAO的接口不被异常所污染,假设你抛出了SQLException,以后要是换了Spring DAO模板,那DAO接口就不再抛出了SQLException,这样,你的接口抛出异常就是对接口的污染。
2)、DAO异常向外传播给更高层处理,以便异常的错误原因不丢失,便于排查错误或进行捕获处理。
 
这里还有一个设计上常常令人困扰的问题:很多人会问,那定义一个什么样的异常抛出呢,或者是直接抛出一个throw RuntimeException(e)? 对于这个问题,需要分场合,如果系统小,你可以直接抛出一个throw RuntimeException(e),但对于一个庞大的多模块系统来说,不要抛这种原生的非检查异常,而要抛出自定义的非检查异常,这样不但利于排错,而且有利于系统异常的处理,通常针对每一个模块,粗粒度的定义一个运行时DAO异常。比如:throw new ModelXxxDAORuntimeException(".....",e),对于msg信息,你可写也可不写,根据需要灵活抛出。
 
这里常见一个很愚昧的处理方式,为每个DAO定义一个异常,呵呵,这样累不累啊,有多大意义,在Service层中调用时候,如果要捕获,还要捕获出一堆异常。这样致命的问题是代码混乱,维护困难,阅读也困难,DAO的异常应该是粗粒度的。
 
二、业务层异常处理
 
习惯上把业务层称之为Service层或者服务层,Service层的代表的是业务逻辑,不要迷信分太多太多层有多大好处,除非需要,否则别盲目划分不必要的层,层越多,效率越差,根据需要够用就行了。
 
Service接口中的每个方法代表一个特定的业务,而这个业务一定是一个完整的业务,通常会看到一些傻X的做法,数据库事务配置在Service层,而Service的实现就是DAO的直接调用,然后在控制层(Action)中,调用了好多Service去完成一个业务,你气得已经无语了,低头找砖头去!!!
 
搞明白以上两个问题后再回过头看异常怎么处理,Service层通常依赖DAO,而Service层的通常也会因为调用别的非检查异常方法而必须面对异常处理的问题,这里和DAO层又有所不同,彼一时,此一时嘛!
一般来说一个小模块对应一个Service,当然也许有两个或多个,针对这个模块的Service定义一个非检查异常,以应付那些不可避免的异常检查,这个自定义异常可以简单的命名为XxxServiceRuntimeException,将捕获到的异常顺势转译为非检查异常后抛出。我喜欢这么做,因为前台是J2EE应用,前台是web页面,它们的Struts2等框架会自动捕获所有Service层的异常,并把异常交给开发者去自由处理。
 
但是还有一种情况,由于一些特殊的限制,如果某个异常一旦发生,必须做什么什么处理,而这种处理时硬性要求,或者调用某个Service方法,必须检查处理什么异常,也可以抛出非检查的自定义异常,往往出现这种情况的是政治原因。不推崇这种做法,但也不排斥。
 
总之,对于接口,尽可能不去用异常污染她!
 
三、控制层异常
 
控制层说的简单些就是常见的Action层,主要是控制页面请求的处理。控制层通常都依赖于Service层,现在比较流行的框架对控制层做得都相当的到位,比如Struts2、SpringMVC等等,他们的控制层框架会捕获业务层的所有异常,并在控制层中声明可能抛出Exception,因此控制层一般不处理什么异常。
如果是控制层中因为调用了一些非检查异常的方法,比如IO操作等,可以简单处理下异常,保证流的安全,这才是目的。
 
四、显示层异常处理
 
对于页面异常,处理的方式多种多样,一是不处理异常,一旦异常了,页面就报错。二是定义出错页面,根据异常的类型以及所在的模块,导航到出错页面。
一般来说,出错页面是更友好的做法。
另外还有特殊的处理方式,展示页面的模板可以捕获异常,并根据情况将异常信息铺到相应的位置,这样就更友好了,不过复杂度较高。
怎么处理,就看需要了。
 
五、总结
 
1)、对于异常处理,应该从设计、需要、维护等多个角度综合考虑,有一个通用准则:千万别捕获了异常什么事情都不干,这样一旦出现异常了,你没法依据异常信息来排错。
2)、对于J2EE多层架构系统来说,尽可能避免(因抛出异常带来的)接口污染。
 
以上论述仅代表个人观点,欢迎交流。

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/244138

分享到:
评论

相关推荐

    Java异常处理机制及应用.pdf

    Java 异常处理原则是指在处理异常时需要遵守的一些基本原则,如尽量少地抛出异常、合理地使用 finally 块、避免 catch-all 异常、使用多 catch 块等。 五、Java 异常处理机制的应用 Java 异常处理机制的应用非常...

    有效处理JAVA异常三原则

    为了深入理解和正确实施这一机制,本文将阐述有效处理Java异常的三个重要原则,并结合JCheckbook类的示例进行讨论。 首先,Java中的异常是由Throwable类的层次结构所定义的,其中包含了Error、Exception以及...

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

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

    Java异常处理终结篇——如何进行Java异常处理设计 - 望远的个人页面 - 开源中国社区1

    在进行Java异常处理设计时,我们需要遵循以下原则: 1. **不要直接忽略异常**:捕获到的异常应当被适当处理,无论是记录日志、通知用户还是尝试恢复。忽略异常可能会导致程序行为不可预测,甚至导致程序崩溃。 2. ...

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

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

    JAVA中异常处理的WORD文档

    异常处理基于匹配原则,即异常对象的类型必须与`catch`后面的异常类匹配。`Throwable`是最顶级的异常类,但通常我们只关心`Exception`及其子类,因为它们更具体且与程序逻辑相关。`Error`类通常表示系统级别的错误,...

    论文研究-基于Java异常处理机制的研究 .pdf

    Java异常处理机制研究的知识点涵盖了异常处理的基本概念、分类、原则以及实际应用等方面。 1. 异常处理概念 异常处理是Java语言中用于处理程序运行时遇到的错误和异常情况的一种机制。它通过异常类的层次结构来实现...

    Java异常处理的设计原则.pdf

    以下是基于给定内容总结的Java异常处理的设计原则: 1. **早处理**:异常不应该用于控制正常程序流程,而应该仅用于处理非预期的情况。一旦发生异常,应尽早捕获并处理,避免异常向上冒泡到程序的更高层次。如果不...

    java开发异常处理与日志规范

    Java开发中的异常处理和日志规范对于保持代码的健壮性和可维护性至关重要。下面将详细阐述这些要点: 1. **避免捕获可预检查的RuntimeException**:在Java中,像NullPointerException和IndexOutOfBoundsException...

    Java异常处理教程

    本教程将深入探讨Java异常处理的基础、原则以及最佳实践。 一、异常的分类 Java中的异常类层次结构主要基于`java.lang.Throwable`类,它有两个主要子类:`Error`和`Exception`。`Error`通常表示系统级的错误,如...

    Java异常处理-异常处理的方式2:throws

    综上所述,Java异常处理中的`throws`关键字提供了将异常处理责任转移给调用者的能力,使得代码结构更加清晰,同时遵循了异常处理的职责分离原则。正确理解和使用`throws`有助于编写出健壮、可维护的Java程序。

    Java异常处理基础-Java教程共1页.pdf.zip

    Java异常处理的原则是尽早发现,尽快处理。通过适当的异常处理,可以避免程序因为未处理的异常而突然崩溃,同时提供给用户更友好的错误信息。 在实际开发中,应遵循以下最佳实践: - 使用具体的异常类:避免使用...

    高效的java异常处理

    因此,异常处理是Java编程中不可或缺的一部分。 在Java中,异常处理机制是通过try-catch-finally语句块实现的。当一个异常在try块中被抛出时,控制权会立即转移到相应的catch块。catch块是用来处理特定类型的异常,...

    基于JAVA常见异常处理研究.pdf

    JAVA异常处理是JAVA语言的重要机制,正确、合理地处理异常对电脑的稳定性和安全性有着极为重要的作用。异常主要有三类,包括异常处理语句的定义、捕捉异常和程序流程跳转等。 一、 JAVA 异常处理机制 JAVA 包括了...

    JAVA异常处理原因方法

    ### JAVA异常处理原因方法 #### 程序错误原因与概念 在软件开发中,程序错误是不可避免的,它们可以大致分为三类:编译错误、运行错误和逻辑错误。 - **编译错误**,也被称为“语法错误”,这类错误是在编译阶段...

    Java异常框架设计

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

    java 异常类处理

    在进行异常处理时,一个良好的实践是遵循“尽早发现,尽早处理”的原则,避免异常传播到程序的高层。此外,异常信息应具有足够的描述性,方便开发者定位问题。通过自定义异常类,可以更好地封装业务逻辑错误,并提供...

    Java有效处理异常的三个原则

    总的来说,Java异常处理的原则是提高程序的健壮性,确保在遇到错误时能够正确响应。通过具体明确地抛出和捕获异常,尽早发现和处理问题,以及延迟捕获以实现更精细的控制,我们可以创建出更稳定、易调试的Java应用...

    Java 异常处理面试集锦及答案20道

    Java异常处理是编程实践中不可或缺的一部分,它为程序员提供了一种优雅的方式来...通过理解并熟练应用上述Java异常处理的知识,开发者可以编写出更加健壮、易于维护的代码,并在面试中表现出对Java编程原则的深刻理解。

Global site tag (gtag.js) - Google Analytics