[8] 异常 8-6(62) 每个抛出的异常都要有文档

文档的重要性之前已经说明,对于异常来说,文档注释同样重要。(包括 Runtime 异常)

一个方法可能抛出多个异常,对于每一个异常,都应该通过 @throws 来描述此异常

比如,jdk 源码(oracle jdk 8)中 ArrayList#addAll 方法描述了可能产生的异常

 

       
       
   

// removeRange 则更加详细地描述了 异常发生的条件    

同样的 ,ConcurrentHashMap 中 , computeIfAbsent 针对mappingFunction 详细描述了可能产生的异常,以指导调用者避免发生运行时异常,或者在发生异常后,找到解决办法

为何需要文档说明,很重要的原因就是,每个人对于编程的思路可能是不同的,很多人应该都有这种感觉,在看别人代码的时候,非常难受。无论对方的水平和你是否一致,或者比你好或者坏,看别人的代码都非常费脑子。改别人的代码则尤其费脑子。

如果文档中没有相应的说明,会怎样?程序当然正常跑,只是调用者在调用的时候,就非常难受,他需要去认真地去读你的源代码。

这一点,是和Java的 封装特性相违背的。

何为封装? 也就是调用者不需要关心实现细节,不需要知道这个数据,这个 return 的结果是怎么来的,只需要调用,并获取结果就行。这种封装的特性,使得我们可以借助开源社区的力量,获取别人给我们封装好的功能,同时也可以向社区贡献自己的实现。所以,现在的java 才这么好用。试想一下,如果我们没有这种封装分享,每个人都需要从 java se 开始造轮子,没有 spring 没有 mvc 没有 mybatis ,每个人都需要自己实现http 协议,参数的接受,jdbc 从原始开始封装。所有的bean 对象自己去new ,去管理,去优化,今天的开发是什么样子。

上面的例子当然有些极端了,但也足以说明文档的重要性。没有文档,所有人都需要从 springBoot 的源码开始啃,估计大家也就不用这玩意儿了,说100%的人看不懂那是胡说,说99%的人看不懂,绝对偏低了。

文档中声明抛出的异常对于接口来说尤为重要。

大多数时候,我们看程序,优先看接口,接口是对外交互的类,是我们调用程序的关键所在。并且,接口相比实现类更加简洁,只有方法声明,没有多余的东西,上面的每个方法都描述了自己的作用。同时,throws 描述也非常重要,异常表明了失败条件,有什么异常,就意味着有对应的条件。

比如,看到 NullPointerException 就应该明白,肯定是某个参数,或者参数对象中某个字段,属性等不能为null

看到 IOException 就知道,这里面肯定有 io 相关的操作。大多数时候,就要关注文件路径,文件是否存在,是否允许访问,是否可写等。

良好的异常文档说明,可以帮助调用者迅速明白失败条件,避免出现一些不该发生的错误。

资源下载: