也说Java中的Exception


1. Exception的定义

顾名思义,Exception代表一个异常,即正常的程序行为之外的情况。这个定义看起来明确,实际则不然。比如一个程序有一个Validation的功能,当校验失败时是不是一个异常呢?我认为不是的,因为校验失败的处理是程序设计中预料之中的正常功能。从这个例子,我们可以看出异常的使用时机在实际的开发中,不同人是有不同理解的。


2. Exception的分类

Java异常的继承层次:



To understand how exception handling works in Java, you need to understand the three categories of exceptions:

  • Checked exceptions: A checked exception is an exception that is typically a user error or a problem that cannot be foreseen by the programmer. For example, if a file is to be opened, but the file cannot be found, an exception occurs. These exceptions cannot simply be ignored at the time of compilation.

  • Runtime exceptions: A runtime exception is an exception that occurs that probably could have been avoided by the programmer. As opposed to checked exceptions, runtime exceptions are ignored at the time of compliation.

  • Errors: These are not exceptions at all, but problems that arise beyond the control of the user or the programmer. Errors are typically ignored in your code because you can rarely do anything about an error. For example, if a stack overflow occurs, an error will arise. They are also ignored at the time of compilation.


Exception的原因可以分为三类:

用户引起的:输入的非法的数据,进行非法的操作

软件开发者引起的:多数是因为对其他API的不正确的使用或一些bug

程序运行环境引期的:网络,文件系统的错误


对于用户或环境引起的Exception,我认为软件需要尽量去catch住并且妥善处理。这就是为什么Java设计了checked exception,是为了在编译期就进行检查,使开发者尽早发现未处理的异常。

而对于开发者引起的异常,我认为是应该在开发过程中尽量避免的,所以不需要去catch和处理。


3. 异常的使用

异常的使用可分为三个问题:

当我们编写被其他程序调用的程序时:

  • 何时抛出异常
  • 抛出那种异常
当我们调用其他程序时:
  • 如何处理异常

3.1 何时抛出异常

仅当发生一种预料之外的情况或方法的合约规定之外的情况时并且我们不知该如何处理时,才抛出异常。不要使用异常来代替返回值的作用,这样会使程序难于理解和修改。也不要用异常来控制程序运行的流程,这样可能会买下定时炸弹,比如后来代码被其他工程师多加了个try/catch或throw,这样一下就改变了流转的顺序。另一个重点是不知如何处理,我们应该尽量使我们编写的方法更加健壮(robust),不要动不动就抛异常,这样也能提高整个系统的健壮性。


3.2 抛出哪种异常

这是一个有意思的问题,Java建议开发者尽量使用checked exception,但是也有一些人认为checked exception是一个“错误”,其中就包括Thinking in Java的作者Bruce Eckel。我所知的两类观点有:

观点一: 传统派

尽量抛出checked exception

对于那些通过严格遵守接口调用合约或通过调用前的检查等方式可以避免的异常,使用unchecked exception

观点二:

一律使用unchecked exception


两派争论的焦点就在checked exception上:

cons:checked exception强迫程序员处理异常,减小程序错误的机会,是软件质量提高

pros:当程序员碰到checked exception时,他们也不知如何处理,为了完成任务,他们采用最快的方式(空的catch)处理了异常,准备以后再回来处理,但后来忘了

checked exception需要在方法上声明,对于API类软件,添加一个exception会导致向后不兼容

C++,C#,Python等语言中全都没有checked exception,java中的checked exception当初只是一种实验,现在证明不太成功



我还是倾向于观点一,因为如观点二所列出的那些缺点,我觉得不是checked exception的问题。程序员忘记处理的问题可以通过code review或标注//TODO 的方式或测试避免。 API类的兼容性可以通过设计良好的异常层次并且抛出高一级的异常来避免,而且借口的抛出的异常应该变化的不频繁。


3.2 如何处理异常

尽量处理这些异常,也不知如何处理的继续抛。

注意不同层之间的异常的封装和隔离。

尽量避免大的try/catch块

catch具体的异常







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值