Java异常处理不可不知的10条原则

异常的分类:

在这里插入图片描述

  1. Throwable 类是整个Java异常体系的超类,包含Error和Exception两个直接子类。
  2. Error 一般指AVA虚拟机出现错误,在程序中不便也不需要捕获Error类型的异常。一般OutOfMemoryError之类都是Error的子类。
  3. Exception是应用层面上最顶层的异常类,包含RuntimeException(运行时异常,非受检异常)和 Checked Exception(受检异常)

1,RuntimeException是一种Unchecked Exception。即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出RuntimeException类。一般来说,RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。

2,Checked Exception是相对于Unchecked Exception而言的,Java中并没有一个名为Checked Exception的类。它是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是Checked Exception。JAVA 语言规定必须对checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。常用的Checked Exception有IOException、ClassNotFoundException等。

3,运行时异常(runtime exception)与受检异常(checked exception)的最大区别是不强制对抛出的异常进行处理。

1,JVM捕获并处理未被应用程序捕获的异常

无论是受检异常(Checked Exception)还是运行时异常(Runtime Exception),如果异常没有被应用程序捕获,那么最终这个异常会交由JVM来进行处理,会明显出现下面两个结果:

当前线程会停止运行,异常触发点后面的代码将得不到运行。

异常栈信息会通过标准错误流输出。

2,异常catch有顺序性,优先catch子类型异常

在catch异常时,如果有多个异常,那么是会有顺序要求的。子类型必须要在父类型之前进行catch,catch与分支逻辑是一致,如果父类型先被catch,那么后被catch的分支根本得不到运行机会。

3,受检异常(checked exception)必须处理或者向上抛出

我们必须要对底层抛出来的受检异常进行处理,处理方式有try…catch…或者向上抛出(throws),否则程序无法通过编译。

4,在上层对异常进行统一处理

如果一个方法中,既包含业务逻辑,又包含异常处理程序,那么实际上这个方法就做了两件事情。如果异常上层可以处理,那么就不应该在下层处理。在上层进行处理的好处是,可以对异常进行统一地处理。而至于将异常处理程序分散到代码的各个地方,导致维护起来十分困难。

5,尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定异常

在捕获和处理异常时,一股脑地catch Exception对象,所有的异常都使用相同的处理,这样做的后果是我们会无形中忽略那些重要的异常。我们应该统一抛出Exception的具体子类。

6,不要生吞异常

如果我们不把异常抛出来,或者也没有输出到日志 (Logger) 之类,程序可能在后续代码以不可控的方式结束。没有人能够轻易判断究竟是哪里抛出了异常,以及是什么原因产生了异常。本质上是掩盖了问题,导致后期很难排查哪里出现了问题。

7,Throw early,catch late原则

在发现问题的时候,第一时间抛出,能够更加清晰的反映问题。在处理异常的时候可以保留原有异常的cause信息
直接再抛出或者构建新的异常抛出去。

8,涉及到资源时,需要finally代码块中释放资源

如果涉及到资源的关闭时,应该将关闭资源的代码写在finally代码块内。

9,最小化try{ } catch{ }范围

try-cath代码段会产生额外的性能开销,会影响JVM对代码进行优化,所有建议仅捕获有必要的代码段,尽量不要一个大try包住整段的代码,也就是说try的范围应该尽量小,最好就是try住抛出异常的那个方法即可。

10,不要使用异常控制代码流程

不要使用异常控制代码流程,远比我们通常意义上的条件语句(if/else,switch)要低效。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值