目录

Throwable异常树

子类1:Error(错误)

子类2:Exception(异常)

运行时异常:RuntimeException类及其子类异常

非运行时异常 (编译异常):是RuntimeException以外的异常

结论

20220913追加


Throwable异常树

 受查异常(编译异常):在编译时被强制检查的异常,必须处理,否则程序编译不通过。 

子类1:Error(错误)

是程序无法处理的错误。指示合理的应用程序不应尝试捕获的严重问题。这些错误是不应该发生的异常情况。 也就是说,出于编译时检查异常的目的,Error 及其子类被视为未经检查的异常。

这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。

子类2:Exception(异常)

是程序本身可以处理的异常。指示合理的应用程序可能想要捕获的条件。

运行时异常:RuntimeException类及其子类异常

可以在 Java 虚拟机正常运行期间抛出的异常

非受查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

非运行时异常 (编译异常):是RuntimeException以外的异常

受查异常,如果可以通过方法或构造函数的执行抛出并传播到方法或构造函数边界之外,则需要在方法或构造函数的 throws 子句中声明它们。

Java编译器会检查,也就是说,当程序中可能出现这类异常,要么用 try-catch 语句捕获它,要么用 throws 子句声明抛出它,否则编译不会通过。

结论

如上所示,异常有三大块,Error、Exception.RuntimeException、Exception.其他。其中Exception.其他是在编译时期就会检查的异常,除此之外都是编译期不会检查的异常,所以在Error、Exception.RuntimeException块,我们需要尽量捕获,所以需要顶层父类。

虽说,对于Error,An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. 明确表示不应尝试捕获,但是对于一些特殊情况是需要捕获的,例如在阿里巴巴规范中指出的NoSuchMethodError错误

所以业务异常捕获、事务回滚都是用Throwable:在exception之外的异常,能捕获就尽量捕获,所以用顶层父类 

20220913追加

@Transactional(rollbackFor = Throwable.class)

事务回滚使用Throwable,尽可能捕获到所有的异常,回滚数据,保证数据的正确性

捕获异常使用Exception

sonar扫描出坏味道

Throwable 是 Java 中所有错误和异常的超类。 错误是所有错误的超类,这些错误并不意味着被应用程序捕获。捕获 Throwable 或 Error 也会捕获 OutOfMemoryError 和 InternalError,应用程序不应尝试从中恢复

假设,出现了Error非Exception,需要优先保证数据的正确性,业务逻辑上来说,未捕获到的Error会抛出不做处理。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐