`
steven_cheng
  • 浏览: 28290 次
  • 来自: 北京
社区版块
存档分类
最新评论

异常处理

    博客分类:
  • java
阅读更多

最近刚好作了一个产品的异常处理规范,把我做的也拿出来晒晒,和大家讨论一下。

1、CheckException or UnCheckedException

个人倾向用UnCheckedException。我见过的最多的处理异常的代码就是记录日志或转换后抛出,好像做其他操作的少之又少。我以前还见过有人不管三七二十一,抓到什么抛什么,结果一个接口抛出了3-5种CheckException。别扭啊,呵呵。

当然,最大的缺陷就是对接口调用者的使用。至少UnCheckedException可以让接口调用者选择catch还是不catch。

因为这是一个遗留系统,都使用了CheckedException,不过好在使用的比较规范,没有太大麻烦。

2、异常信息

因为开发者众多,异常信息五花八门,有中文的有英文的,有简单的,有复杂的。散落在各个类里,修改起来很麻烦。

我的处理办法是,定义异常码,异常信息和异常码一一对应,定义在properties文件里,抛出异常的地方只引用异常码。这样,如果需要修改异常信息,只要修改properties文件重新打包即可。异常码分为原因码和位置码。位置码一般用在业务逻辑类里。比如一般用到的Facad模式,可能一个接口定义了n个方法,每个方法都抛出XXXBusinessException(XXX用于区分业务子包),抛出的异常码在代码里顺序定义即可。原因码表示某类异常,比如SQLException引起的异常都为8000。

异常码中原因码按包、类、接口定义,比如:前两位表示一级子包,接下来两位留给二级子包,接下来两位表示类,最后3位表示方法。

异常信息如果需要,可以保留现场信息。比如:“用户[abc]已存在”。这样的信息就比“用户已存在”明确。这个功能可以通过java.text.MessageFormat实现。

3、异常的链式抛出

即,在调用底层接口时捕获到异常,需要转成其他的异常抛出时,使用带Throwable的构造器。这样可以保留最原始的出错信息。

异常基类代码:

java 代码
  1. public class BaseException extends Exception {   
  2.        
  3.        
  4.     protected long errorCode;   
  5.        
  6.        
  7.     protected String[] args;   
  8.   
  9.     /**  
  10.      * @param errorCode  
  11.      */  
  12.     public BaseException(long errorCode) {   
  13.         super();   
  14.         this.errorCode = errorCode;   
  15.     }   
  16.        
  17.     /**  
  18.      * @param errorCode  
  19.      * @param cause  
  20.      */  
  21.     public BaseException(long errorCode,Throwable cause) {   
  22.         super(cause);   
  23.         this.errorCode = errorCode;   
  24.     }   
  25.        
  26.     /**  
  27.      * @param errorCode  
  28.      * @param cause  
  29.      * @param args @see {@link java.text.MessageFormat#format(Object)}  
  30.      */  
  31.     public BaseException(long errorCode,Throwable cause,String[] args) {   
  32.         super(cause);   
  33.         this.errorCode = errorCode;   
  34.         this.args = args;   
  35.     }   
  36.        
  37.     /* (non-Javadoc)  
  38.      * @see java.lang.Throwable#getMessage()  
  39.      */  
  40.     public String getMessage() {   
  41.         String message = "";   
  42.         if (this.args == null || this.args.length == 0) {   
  43.             message = MessageSource.getInstance().resolveCodeWithoutArguments(   
  44.                     this.errorCode);   
  45.         } else {   
  46.             message = MessageSource.getInstance().resolveCode(this.errorCode)   
  47.                     .format(this.args);   
  48.         }   
  49.   
  50.         return this.errorCode+":"+message;   
  51.     }   
  52.   
  53.     /**  
  54.      * @return the errorCode  
  55.      */  
  56.     public long getErrorCode() {   
  57.         return errorCode;   
  58.     }   
  59.   
  60.     /**  
  61.      * @return the args  
  62.      */  
  63.     public String[] getArgs() {   
  64.         return args;   
  65.     }   
  66.   
  67. }  

其中:MessageSource这个类就是根据是否有现场信息,分别处理,得到完整异常信息表述字符串。

关于主贴中嵌套打印的部分,从JDK1.4开始,Throwable就是嵌套打印的,所以不必再覆盖那几个方法了。

现在假使,有AException 和BException,都从BaseException继承。在方法里,我们捕获了AException,需要转换成BException抛出,这时候我们就非常希望能直接用AException的信息(errorCode和args)。所以,如果再来这样一个构造器似乎更好:

java 代码
  1. public BaseException(BaseException cause){   
  2.     this.errorCode = cause.getErrorCode();   
  3.     this.args = cause.getArgs();   
  4. }  

但是,因为Exception有一个构造器:public Exception(Throwable cause),所以这样的构造器就是重载(overload),而不是覆盖(Override)。重载,入参又是父子类关系,这样的方法很容易混淆,所以就没有提供。

我按照这个异常处理规范,花了两三天时间把代码重构了一遍。似乎用起来挺好使

分享到:
评论
3 楼 hatedance 2009-03-11  
异常码?不是又回到了过去了吗?
不敢说异常码不好。但是定义异常类的优势我想就是它有一个有意义的名字。
2 楼 jorwen_fang 2007-08-13  
不错,异常码方式。这样的话不会产生一大堆自定义异常类了。

1 楼 talangniao 2007-07-18  
不知道怎样使用,初学者!
给个具体范例巴!别骂我笨别骂我傻!我是爱java的!

相关推荐

    C#异常处理总结及简单实例

    C#异常处理总结及简单实例 一、异常处理的理解? 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。 因此处理这种错误,就称为异常处理。 二、异常处理如何操作? C# 异常处理时建立在...

    MySQL定义异常和异常处理详解

    MySQL中的异常处理是数据库编程中不可或缺的一部分,它允许开发者预设对可能出现的错误或异常的响应,从而确保程序的稳定性和健壮性。在MySQL中,异常定义和处理主要是通过`DECLARE`语句来实现的。 1. **异常定义**...

    异常处理 异常处理 异常处理

    异常处理是编程中的一种机制,用于捕获和处理运行时发生的错误或异常情况。异常可以由硬件引发,如硬件异常,也可以由操作系统或应用程序自身触发,即软件异常。当异常发生时,操作系统允许程序有机会检查异常类型并...

    易语言线程结构异常处理

    在易语言中,线程是并发执行的程序单位,线程结构异常处理是编程过程中非常重要的一环,因为线程可能会遇到各种异常情况,如内存访问错误、除零异常等。 线程结构异常处理源码是易语言中处理这些异常的关键部分。当...

    java异常处理习题

    Java 异常处理习题 Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出...

    易语言HOOK异常处理

    "New_SE_Handler"可能是一个新的结构化异常处理程序,结构化异常处理(SEH)是Windows操作系统中的一个特性,用于处理硬件和软件异常。 "GetSeAddr"可能是获取异常发生时的地址函数,这对于分析异常原因和定位问题...

    c/vc++/MFC异常处理/结构化异常处理 浅析

    在编程领域,异常处理是确保程序健壮性与稳定性的关键技术。对于C、C++以及基于MFC(Microsoft Foundation Classes)的开发来说,异常处理更是不可或缺的一部分。本篇文章将深入浅析C、C++中的异常处理机制以及MFC中...

    详解SpringCloud Finchley Gateway 统一异常处理

    详解 SpringCloud Finchley Gateway 统一异常处理 SpringCloud Finchley Gateway 统一异常处理是指在使用 SpringCloud Finchley 版本的 Gateway 时,如何统一处理系统级异常的方法。默认情况下,SpringCloud ...

    异常处理.ppt异常处理.ppt异常处理.ppt异常处理.ppt异常处理.ppt

    【异常处理】是编程中必不可少的一个环节,尤其是在Java这样的面向对象语言中。异常处理机制使得程序在遇到错误时能够优雅地中断执行流程,提供错误信息,并有机会进行恢复操作,而不是简单地崩溃。以下是对异常处理...

    异常处理机制知识点小总结

    异常处理是Java编程中至关重要的一个概念,它确保了程序在遇到错误或异常情况时能够以优雅的方式继续执行或者终止。下面是对Java异常处理机制的详细解析。 在Java中,异常是程序运行时发生的错误,它中断了正常的...

    ARM处理器异常处理步骤

    ARM处理器异常处理是指ARM微处理器对各种异常情况作出响应和处理的过程。异常指的是处理器在正常执行程序时遇到的特殊情况,例如外部中断请求、未对齐的内存访问错误、指令预取终止等。为了保证系统的稳定性和正确性...

    Power builder9异常处理

    在 PowerBuilder 9(简称 PB9)开发过程中,异常处理是一项关键的技术,它能帮助开发者有效地管理和解决程序中出现的错误,确保系统的稳定运行。在实际应用中,开发者经常会遇到各种预知和不可预知的问题,如系统级...

    游标和异常处理 游标和异常处理

    游标和异常处理 游标是 SQL 的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将...

    ADS异常处理.pptADS异常处理.pptADS异常处理.ppt

    《ADS异常处理详解》 异常处理是嵌入式系统中至关重要的部分,特别是在基于ARM架构的系统中。本文将深入探讨ARM处理器的异常处理机制,包括异常类型、处理流程、异常优先级以及向量表等内容。 一、异常类型 ARM...

    java实验报告4-异常处理

    Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误时能够优雅地运行,而不是突然崩溃。本实验报告“java实验报告4-异常处理”旨在帮助初学者掌握Java中的异常处理机制,以及如何利用log4j进行日志...

    reactnative异常处理库

    React Native 异常处理库是专门为在React Native框架下开发的混合移动应用提供错误管理和调试支持的工具。React Native允许开发者使用JavaScript编写原生移动应用,但JavaScript代码的运行环境中可能会遇到各种错误...

    Spring Cloud Gateway的全局异常处理

    ### Spring Cloud Gateway全局异常处理详解 #### 一、引言 在微服务架构中,网关作为服务入口,承担着路由转发、限流熔断、鉴权认证等职责。Spring Cloud Gateway作为一款基于Spring Framework 5、Project Reactor...

    两数计算+异常处理

    课程作业,实现两数计算及其异常处理,异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。 Java中的异常可以是函数...

Global site tag (gtag.js) - Google Analytics