Checked Exception and UnChecked Exception

来源:互联网 发布:网盘 知乎 编辑:程序博客网 时间:2024/05/16 13:47

使用Checked Exception还是UnChecked Exception

如果你希望强制你的类调用者来处理异常,那么就用Checked Exception; 
如果你不希望强制你的类调用者来处理异常,就用UnChecked。

        那么究竟强制还是不强制,权衡的依据在于从业务系统的逻辑规则来考虑,如果业务规则定义了调用者应该处理,那么就必须Checked,如果业务规则没有定义,就应该用UnChecked。

还是拿那个用户登陆的例子来说,可能产生的异常有: 
          IOException (例如读取配置文件找不到) 
          SQLException (例如连接数据库错误) 
          ClassNotFoundException(找不到数据库驱动类)

         NoSuchUserException 
        PasswordNotMatchException

        以上3个异常是和业务逻辑无关的系统容错异常,所以应该转换为RuntimeException,不强制类调用者来处理;而下面两个异常是和业务逻辑相关的流程,从业务实现的角度来说,类调用者必须处理,所以要Checked,强迫调用者去处理。

        在这里将用户验证和密码验证转化为方法返回值是一个非常糟糕的设计,不但不能够有效的标示业务逻辑的各种流程,而且失去了强制类调用者去处理的安全保障。 
        至于类调用者catch到NoSuchUserException和PasswordNotMatchException怎么处理,也要根据他自己具体的业 务逻辑了。或者他有能力也应该处理,就自己处理掉了;或者他不关心这个异常,也不希望上面的类调用者关心,就转化为RuntimeException;或 者他希望上面的类调用者处理,而不是自己处理,就转化为本层的异常继续往上抛出来。

 

使用checked异常的最佳实践

现在假设有些错误我们确定为checked异常,那么我们针对这些checked异常要怎样编码才合理呢?

    1 不要用checked异常做流程控制。无论如何,checked异常也是一种错误。只是我们可以处理(修复)它而已。这种错误和普通业务流程还是有区别 的,而且从效率上来说,用异常控制业务流程是不划算的。其实这个问题有时候很难界定,因为checked异常“可以修复”,那么就是说修复后程序照常运 行,这样一来真的容易跟普通业务流程混淆不清。比如注册用户时用户名已经存在的问题。这个时候我们要考虑,为什么要用checked异常?这和使用业务流 程相比,给我带来了什么好处?(注意checked异常可以修复,这是和unchecked异常本质的区别)照我的理解,checked异常应该是介于正 常业务流程和unchecked异常(严重错误)之间的一种比较严重的错误。出现了这种错误,程序无法完成正常的功能是肯定的了,但我们可以通过其他方式 弥补(甚至修复),总之不会让程序挂起就是。其实这一点也是设计checked异常时要考虑的问题,也是代价之一吧。

    2 对checked异常的封装。这里面包括2个问题:

第一,如果要创建新的checked异常,尽量包含多一点信息,如果只是一条message,那么用Exception好了。当然,用Exception会失去异常的型别信息,让客户端无法判断具体型别,从而无法针对特定异常进行处理。

第二,不要让你要抛出的checked exception升级到较高的层次。例如,不要让SQLException延伸到业务层。这样可以避免方法签名后有太多的throws。在业务层将持久层的所有异常统统归为业务层自定义的一种异常。

 

客户端调用含有throws的方法要注意:

第一,不要忽略异常。既然是checked异常,catch clause里理应做些有用的事情??修复它!catch里为空白或者仅仅打印出错信息都是不妥的!为空白就是假装不知道甚至瞒天过海,但是,出来混迟早 要还的,迟早会报unchecked异常并程序挂起!非典就是个例子。打印出错信息也好不到哪里去,和空白相比除了多几行信息没啥区别。如果 checked异常都被这么用,那真的不如当初都改成unchecked好了,大家都省事!

第二,不要捕获顶层的Exception。你这么干,就是在犯罪!因为unchecked异常也是一种Exception!你把所有异常都捕获了??不是 我不相信你的能力,你根本就不知道该如何处理!这样做的直接的后果就是,你的程序一般来说是不会挂起了,但是出现错误的时候功能废了,表面上却看不出什 么!当然,深究起来,这也不是什么罪大恶极,如果你在catch里打印了信息,这和上面那条的情况是差不多的。而这2条的共同点就是,没有正确使用 checked异常!费了那么大劲设计的checked异常就是给你们上级(客户端)用的,结果你们不会用!真的不如用unchecked干脆利落了!

0 0
原创粉丝点击