这个问题仁者见仁智者见智,每一个人心中的最佳实践不见得一致,可是你要有想法,这个很关键,若是连思考都没有思考过,那就不太好了。java
不少高级语言都提供了异常处理,好比Java、Python、Ruby,比较底层的语言,好比C,没有提供异常机制,最近时兴的Golang,也没有提供一般的try-catch异常机制。程序员
异常机制是必须的么?显然不是,由于咱们一般能够用多个返回值来解决,若是语言自己不支持多返回值,那异常机制就是必须的,不然这个语言写起来真的会很痛苦,你想一想是否是这样?:)面试
异常,故名思议,就是不正常的程序执行流程,咱们拿Java中的一个类继承关系举例: 数据库
异常状况大致能够分红两种: 一、没办法恢复的,上图中的Error红色部分,这种异常状况出现,程序只能崩溃。好比OutOfMemoryError,显然是系统内存不够用了,程序显然跑不下去了,必须崩溃 二、能够尝试恢复的,上图中的Exception绿色部分,这种状况一般不会致使程序崩溃,可是我说的是一般,若是处理不当,程序照崩不误数组
对于第一种状况,咱们无法处理,属于不可控因素,一般的作法就是提早监控,好比发现系统内存剩余量少于10%立马报警,运维人员确定对此深有感触:)微信
第二种状况咱们必定要竭尽所能去处理,由于咱们的服务要追求尽量高的稳定性,五个九、六个9的SLA,因此程序一抛一个exception就立马crash,实在是不合适运维
下面咱们重点聊聊绿色部分Exception,大部分语言的异常处理机制相似,好比C#、Python、Ruby,出问题了抛异常,上层代码能够捕获,也能够不捕获,语言设计者认为这样就OK了,Java分得更细,分红Checked Exception和Unchecked Exception编码
a)Checked Exception是要在方法定义的时候显式声明,上层代码也要显式捕获,这点会在编译阶段强制检查 b)Unchecked Exception,也叫Runtime Exception,不须要在方法定义的时候显式声明,也不强制上层代码显式捕获,一旦抛异常,JVM会沿着方法调用栈层层往上寻找catch块,若是找遍了都找不到,程序crash设计
那这两种异常的使用场景是什么呢?下面是笔者的我的观点,仅供参考:继承
一、Runtime Exception只用来处理坏的编码,这些都是程序员应该提早处理可是忘记处理的,好比NullPointerException,程序员应该在上层代码中判断变量是否为空,若是忘记判断了,那下层代码只能用NullPointerException这个RuntimeException来还以颜色。再好比:ArrayIndexOutOfBoundsException、IllegalArgumentException,咋样,有没有点感受了?
二、RuntimeException虽然说是程序员犯下的错误,可是为了程序不崩溃,仍是要处理,因此咱们一般会在方法调用栈的最顶层catch全部的异常,而后打印log,发报警邮件给工程师,便于之后作bugfix之类的
三、Checked Exception一般是须要程序员去尝试恢复的,好比:FileNotFoundException、EOFException。Checked Exception在向上层代码传递一些信息,让上层代码对症下药
四、举个例子,好比咱们跟数据库打交道有的时候会遇到connection reset这种异常,这个应该封装为哪一种异常返回呢?显然这不是坏的编码致使的,因此要用Checked Exception,上层代码要显式catch,若是发现是ConnectionResetException,要尝试重连数据库。
五、用户登陆的时候,有人封装了UserNotFoundException、PasswordErrorException,你以为是合理的么?我的认为能够这么用,好比写了一个Login方法,用户登陆失败可能会有多种缘由,要把这多种信息传达给上层代码,在一个没有多返回值的语言中,只能使用多种异常
六、为了传达文件不存在这个信息JDK提供了一个FileNotFoundException的异常,你以为这是合理的么?笔者的观点是这样的:要分状况看待,若是要写一个专门判断文件是否存在的方法FileExists,此时无需定义异常,直接返回一个bool类型的值就行,若是在读写文件的方法中,发现某个文件不存在,能够抛出异常,这其实仍是由于不能有多个返回值致使的,由于文件读写操做的方法参数和返回值都是与字节数目啊,字节数组啊之类的,无法往上传递文件不存在这个信息,因此,只能用异常了
七、若是能用if-else分支结构来描述的逻辑,不要用异常,虽然说try-catch看起来能够作分支结构,可是try-catch效率低,不是正常的编码,百害而无一利
说得比较散乱,看来文笔仍是不行啊,看官多多包含,但愿能帮到你:) 本文来自微信公众帐号:it_mianshiti,一我的天天整理面试题真是比较势单力薄,求投稿:)