线程异常和spring异常扩散机制
java中的异常
[Java中的异常总结详解(异常类型、声明异常、抛出异常、捕获异常)_声明异常的关键字是 ,抛出异常的关键字是 ,捕捉异常的关键字是-CSDN博客](https://blog.csdn.net/m0_46316970/article/details/119898445)- 在程序运行过程中,如果 JVM 检测出一个不可能执行的操作,就会出现运行时错误(runtime error)。
- 异常就是程序在运行过程中出现的一些错误,我们通过面向对象的思想,把这些错误也用类来描述,那么一旦产生一个错误,即就是创建了某一个错误的对象,这个对象就是我们所说的异常对象。
- RuntimeException 的任何子类都无需在 throws 子句中进行声明,指的就是这些问题不需要提前被预防(本质上也可以的,只不过没必要),因为只有在真正运行的时候才能发现是否发生问题,一旦在运行期间发生了问题,则一般不会修正,程序直接终端。
- 系统錯误(system error) 是由 Java 虚拟机抛出的,用 Error 类表示。Error 类描述的是内部系统错误。这样的错误很少发生,Error不能被抛出和try
- 异常实际上是方法退出的另外一种方式。
- 异常会在方法调用栈中传递的,某个线程发生了异常,且并没有进行try,那么只是这个线程会挂掉,整个服务或者说main线程不会挂掉的。
checked和unchecked
+ 必须捕获的异常,包括 Exception 及其子类,但不包括 RuntimeException 及其子类,这种类型的异常称为Checked Exception。这种异常在我们写代码的时候IDEA就会提醒我们要么try或者throws + 不需要捕获的异常,包括 Error 及其子类, RuntimeException 及其子类。自定义异常
[自定义异常类 - deng-hui - 博客园](https://www.cnblogs.com/denghui-study/p/14327442.html)异常栈
[一篇文章让你读懂Java异常栈信息-CSDN博客](https://blog.csdn.net/tianjindong0804/article/details/105117779)- lombook中的@SneakyThrows注解可以减少声明异常
1 | public class Example { |
Spring中的异常处理机制
+ spring在对于控制层每个路径下的请求,如果某个请求抛出了异常并不会影响整个spring项目的关闭,这是因为在RequestMappingHandlerAdapter对控制层中代码抛出的异常做出了try受检异常的思考
[滑动验证页面](https://segmentfault.com/a/1190000044581225)(很值得看一下,了解其他语言为啥没有checked异常)@SneakyThrows
Lombok 的 @SneakyThrows 注解允许您在不使用 throws 声明的情况下抛出选中的异常。当您需要从限制性很强的接口(如 Runnable)中的方法引发异常时,这会派上用场。假设我们从 Runnable 中抛出一个异常;它只会传递给线程的未经处理的异常处理程序。- 对于受检异常,该注解可以不用throws抛出异常,这样就算某个方法改动throws的异常发生了变化,该方法中调用链的其他方法不用修改其throws
1 | public class Main { |
1.上面的方法f1不添加SneakyThrows注解就需要在f1方法后面添加throws FileNotFoundException;同时调用f1方法的f2和main也要添加;添加了SneakyThrows注解后,如果后面f1方法改了后,其抛出的异常发生了变化就可以,如果没有使用SneakyThrows注解就要修改f2和main方法的throws,使用了该注解就可以不用这样了。
- 当发生了是非检查异常的时候,使用了该注解和没有使用感觉区别不大:
1 | package org.example; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 山麋一笑!
评论