Java 中的 Exception 有什么用?

用户头像
Braisdom
关注
发布于: 2020 年 10 月 13 日

Exception 的作用,这个问题是一个开放性的问题,没有标准的答案,不同经历的人可能会有不同的答案,后续的陈述这代表我个人的意见,不一定正确,但有一定的参考性。

  1. Exception,顾名思义,代表着程序运行的过程中出现一种不正常的状态,需要中止运行,同时又能快速的发现程序为什么会出现错,通过异常的信息能够快速定位,所以异常要尽可能多的提供瞬时的状态信息,尤其是应用系统自身抛出的异常,需要将上下文状态尽可能多的输出,有助于排查和定位。

  2. Exception 也是一种程序逻辑控制的方式,是程序健壮性的一种表现。其实,大都数异常,程序都应该有一定的相应的处理逻辑,例如:ArrayIndexOutOfBoundsException,这类异常在编码过程中应该能够预见,并需要做出现相应的逻辑控制,有经验的程序员,在编码的过程中就已经考虑到各种异常的情况,待整个系统上线后,出现的问题相对较少,而普通的程序员往往只保证程序在Happy Case 时能够正常运行,却忽略了各种异常情况,往往是在出现问题后进行补救,导致程序在反复补救后,逻辑混乱,这也就是很多项目早期的代码质量高,经过一段时间后,代码惨不忍睹的根源。

  3. 什么时候需要Cache Exception,什么时候需要Throw 呢?这也是不会有标准答案的过程,Java 本身也没有给出标准答案,也没有指导原则。但经过无数次实践的经验后,你就能体会异常的重要性,往往出现很诡异的Bug时,同时可参考的日志或其它信息时,在关键的位置异常被人为的隐藏是多么愚蠢的行为。我在使用一个开源的框架时,时常会发现重要的异常信息被隐藏,导致花费大量的时间去跟踪代码。通过上面的描述,也就不难看出,异常在什么时候需要Throw,什么时候需要Catch,原则其实很简单:1)异常在能够完全掌控的情况下,而且也有明确的逻辑处理时,需要Catch,同时,也需要关注外部程序是否需要感知异常,如果需要,则封装新的异常后重新Throw;2)无法决定处理逻辑的情况下,需要将所有异常Throw,让外部程序决定处理逻辑。

  4. 什么时候定义Exception 同样是没有任何指导原则,只能凭自身的经验判断,根据我个人的经验的原则是:1)需要外部程序对异常情况有明确处理情况时,需要定义异常,以便外部程序能够明确识别;2)内部程序处理过程中出现太多异常,并且这类异常具有共同的特性(例如:ClassNotFountException, NoSuchMehtodException 等),不需要外部程序对这类异常分别处理时,需要定义异常。

  5. Exception 和 RuntimeException 有什么区别,在什么场景下定义,也是一个仁者见仁,智者见智的问题,Java 没有任何指导建议,按我个人的判断很多的定义也不是特别合理,例如:IndexOutOfBoundsException 应该是一个Exception, JDK 却定义为RuntimeExcption, 这类错误需要明确的提醒外部程序对数组进行逻辑限制,应用系统在总是等到出现错误后,才能主动Cache 这类异常;然而像 ClassNotFoundException 这类异常在极少数状态下才会进行逻辑处理JDK 却定义为Exception 导致很多反射类的项目的处理逻辑变得复杂,NullPointerException 也是经常出现的,但定义为RuntimeException 是合理的,因为JDK 从逻辑根本无法捕捉NullPointerException,应该是在JVM 执行过程中才能够进行逻辑判断,具体并未研究。经过上面的两个示例也很容易看出Exception 和RuntimeException 有什么区别,JDK 的设计应该从外部程序使用的角度进行异常设计,由于外部程序导致的异常,并且外部程序应当有逻辑处理异常状态,这类异常理应定义为Exception,而其它由于JVM 在编码期无法判断,也无法从语法层面提供解释的Exception 应该定义为RuntimeException。

针对Java 异常的解读是我个人的见解,就像古诗词一样,不同人有不同的解读,相信JDK 的设计者也无法给 Java Exception 一个明确的解释和原则,只能靠历史的积累,逐形成相对完整的理解,供后人学习。



发布于: 2020 年 10 月 13 日 阅读数: 24
用户头像

Braisdom

关注

ObjectiveSql 作者 2019.11.24 加入

将对世界的想法注入www.objsql.com,将对经验整合在ObjectiveSql 项目中。

评论

发布
暂无评论
Java 中的Exception 有什么用?