java异常 只看这一篇就够了

本文主要分三个部分。一个是jdk原始异常类。这个部分主要讲异常的基础。第二个部分高级篇主要还是讲是spring中的异常处理类。最后讲讲实际我对异常处理的思考。

1.java所有异常的都是从java.lang.Throwable这个类 继承出来的。这个类基本处理完了所有异常应该处理的基础方法。她的两个一级子类Exception 跟Error 其实啥也没干。只是单独多出的一层。但是这么分出来是有意义的。Exception代表了程序员写代码要处理的异常。 而Error代表了程序员写代码处理不了的异常。

Error一出。这java进程就完了。 Exception一出 java进程还在。然后error不能被catch .exception 才能被catch 。这是一般的规定。其实这不是真实的。其实error也是可以被捕获的。否则很多 catch(throwable e)怎么来的 但是java区分 error跟exception的本意是error一旦出了你就是捕获了意义不大。你也做不了什么,比如内存溢出了,你就是捕获了又如何。exception则不然。这种捕获了。你程序还能继续跑。

Exception又包含了运行时异常(RuntimeException, 又叫非检查异常)和非运行时异常(又叫检查异常)。前面一种是你写代码的编译的时候是检查不出来的。也就是编译可以通过。 后面一种类似语法检查吧。先说语法检查。语法检查能帮程序员规避一些问题。

程序最后都是在方法中执行的。

方法定义的时候会进行语法检查。就是看里头每个方法有没有检查异常,如果有检查异常抛出。作为程序员你现在有两种选择。

1.try catch 捕获这个异常。然后在本方法内把异常解决了。
2.不处理这个异常。继续往上抛。也就是在方法定义上throws Exception。当然后面使用这个方法会遇到本方法同样的问题。是自己try catch 还是继续throws。当然如果最后也没有人去 try catch.那这个程序也就挂了。

看到这里。你一定会有疑问了。如果我的方法内没有用任何别的方法。那是不是就不会有异常了。答案是no。 有种异常就是我刚才提到的运行时异常。最常见的就是空指针异常。这种异常编译的时候是不会强制你必须try catch的。另一个疑问,既然异常是一层一层往上抛。那最底层方法的异常是如何出现的。带着这个疑问。我看了很多jdk源码。发现最底层方法异常出现有两种,一种是方法上直接throws 。哪怕方法里没有任何代码。
在这里插入图片描述
第二种是 确实代码中明显的 有 throw 语句。而且throw出来的exception 是检查异常。
在这里插入图片描述
最后一个疑问是如果方法抛出异常了。最后也没有try catch。那程序会死么。答案是

异常的产生讲完了。 下面开始讲捕获异常并处理。也就是try catch finally 。现在有各种组合

try catch
try catch catch
try finally
try catch finally

针对finally ,只想说一句 是在return 之前。

下面开始讲spring里头怎么来处理异常。这里又分为springmvc 。跟springboot两个分支。
先说springmvc . 官方提供了三个注解 @RestControllerAdvice @ControllerAdvice @ExceptionHandler

现在基本都是ControllerAdvice + ExceptionHandler 或者@RestControllerAdvice+@ExceptionHandler实现统一的异常处理。

其中ExceptionHandler定义在方法上。 另两个是定义在类上。从字面意思上来看这套组合是为Controller准备的。也就是Service是不管的。当然很多时候都是Controller只是简单调用Service 。Service 抛出异常。所以基本是可以用的。RestControllerAdvice是比ControllerAdvice 多了一个返回@ResponseBody 的区别。 也就是说你如果返回前端是前后端分离的这种模式。前端调用后端。后端只是返回数据。就用RestControllerAdvice ,如果不是前后端分离。要返回页面的地址的。还是ControllerAdvice+ExceptionHandler。

ExceptionHandler可以指定你要统一处理的exception。如下。
java异常 只看这一篇就够了_第1张图片
每种异常单独给一个方法。可以自己控制。

springboot 里头已经更加升级了。默认已经把错误处理完了。有一个叫BasicErrorController。这个类
在这里插入图片描述
既然有了默认的。就有自定义 。
java异常 只看这一篇就够了_第2张图片
但是实际项目中还有一些场景是用不到controller的。那想有一些统一的处理方法。怎么办? 有办法spring AOP 这是天生的统一处理同一类方法的神奇发明。而且有了aop。打印日志也可以了。不过今天这里就先不说了。

你可能感兴趣的:(基础知识)