异常处理

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

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)。重载,入参又是父子类关系,这样的方法很容易混淆,所以就没有提供。

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

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值