Java之Checked Exception和Unchecked Exception使用的个人理解

原创
2016/11/28 01:23
阅读数 139

**摘要:**最近一个人在搭程序后台框架,碰到了一个问题,就是Exception类型的使用。于是我有了以下的一些想法。

一、 为什么需要使用异常

个人理解:在面向对象程序的开发过程中,我们需要对函数的输入输出检测。当被调用者执行过程中出错的时候,在不改变大量改变现有程序结构的时候,在并无的简单有效办法办法通知调用者调用异常,所以这时候异常出现了。
注意:
在linux开发中:调用出错,通常返回-1或者NULL,并且系统调用设置线程局部变量errno!=0,表示调用错误,然后我们可以使用strerror(errno)输出错误码。 这样每次函数调用我们都需要检测返回值,改变了我们编写代码的结构,非常麻烦。
下面就是几年前我为了简化linux函数调用写的一个宏,在linux内核内部有类似实现,大家可以去看下。
输入图片说明

二、Java异常继承体系结构

下图简单介绍了一下Java的异常继承体系结构
输入图片说明

三、异常的分类及其作用

  1. CheckedException: (非RuntimeException及其子类之外的所有Exception)
    用于提醒开发人员调用API时候对异常处理,并且程序此次调用需要从异常中恢复。一旦运行时这些异常被抛出,代表程序编写必定有BUG。
  2. UnCheckedException:(RuntimeException及其子类)
    用于提醒开发人员调用API时候对异常处理,但是程序此次调用可以不必恢复
  3. Error及其子类:
    程序完全不必恢复,甚至不必捕捉,只需要在系统crash时,能够即时通知运维以及开发人员进行系统恢复,以及运行时软硬件环境排查进行。

四、开发时候使用什么样的Exception

  1. 只使用CheckedException
    优点:
    强迫程序员对异常进行处理 ,代码更加安全 缺点:
    a、函数声明throws列表过长,开发人员可能偷工减料,针对于需要多个catch块处理的,会被放入同一个catch块处理
    b、底层API抛出一个异常,函数可能会需要对多个地方进行改写
  2. 只使用Unchecked Exception
    优点:
    代码更加简洁,改动异常抛出时,不需要改动函数接口
    缺点:
    开发人员可能偷工减料,一个异常都不处理,统一交给全局异常处理模块来进行
  3. 两者混合使用 (JDK所采用的) 是上面两种的折中方案,也是最优方案,对于Checked以及Unchecked异常区分的好,开发事半功倍,但是区分的不好,导致开发过程混乱。

五、CheckedException与UncheckedException的区分

这几天思考了一下,关于如何区分,提炼为以下几句话:

  1. 被调用者可以恢复调用错误,不使用Exception,比如某些情况下传入null作为参数(按常理需要抛出一个CheckedException并且由调用者显示处理)
  2. 被调用无法处理的调用错误,但是调用者需要处理的程序错误,使用CheckedException,比如IOException,所打开文件不存在,那么调用文件打开API接口的函数必须要对此处理
  3. 被调用者与调用者都无法处理的情况,使用UncheckedException,比如ClassNotFoundException,我们动态加载一个类,结果类的class文件不存在于classpath内,这种就直接让全局异常处理模块捕获该异常并且输出到日志中即可

六、总结

虽然异常区分的原则十分简单,但是每个人对于程序错误是不是可以处理的,如果处理的话,需要由哪些部分来进行处理的理解不尽相同。虽然素质较高的开发人员,对于异常区分的理解可能会趋于相同,但是高素质的永远是少部分。
所以,在为了保证项目质量的情况下,总结起来就是在开发中尽量只用一种异常,这样避免异常混用,造成程序异常处理体系的混乱不堪。

展开阅读全文
打赏
0
0 收藏
分享
加载中
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部