前言
在日常项目开发中,异常是常见的,但是如何更高效的处理好异常信息,让我们能快速定位到BUG,是很重要的,不仅能够提高我们的开发效率,还能让你代码看上去更舒服,SpringBoot的项目已经有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。
SpringBoot默认的错误处理机制
返回错误页面
默认返回 Whitelabel Error Page页面的样式太单调,用户体验不好。
如 果 我 们 需 要 将 所 有 的 异 常 同 一 跳 转 到 自 定 义 的 错 误 页 面 , 需 要 再 src/main/resources/templates 目录下创建 error.html 页面。
注意:名称必须叫 error
1 | html复制代码<!DOCTYPE html> |
返回json格式api
Json格式的结果字符串不统一,与前端人员约定统一格式不一致
源码分析
SpringBoot在页面 发生异常的时候会自动把请求转到/error,SpringBoot内置了一个BasicErrorController对异常进行统一的处理,当然也可以自定义这个路径
1 | java复制代码@RequestMapping( |
我们可以看到刚好对照两个方法一个返回错误页面,一个返回错误字符,默认错误路径是/error
如果有自定义就用自定义的
1 | properties复制代码server.error.path=/custom/error |
自定义错误处理
SpringBoot提供了ErrorAttribute类型
自定义ErrorAttribute类型的bean还是默认的两种响应方式,只不过改变了响应内容项而已
1 | java复制代码package cn.soboys.core; |
自定义业务异常类
继承RuntimeException
1 | java复制代码package cn.soboys.core.authentication; |
全局捕获异常
通过SpringBoot提供的@RestControllerAdvice
和@ControllerAdvice
结合@ExceptionHandler
使用
@RestControllerAdvice
和@ControllerAdvice
区别和@RestController,@Controller
一样如果想返回json格式也可以单独使用@ResponseBody
注解在方法上
需要捕获什么异常通过@ExceptionHandler
来指定对应异常类就可以了这里原则是按照从小到大异常进行依次执行
通俗来讲就是当小的异常没有指定捕获时,大的异常包含了此异常就会被执行比如Exception
异常包含了所有异常类,是所有异常超级父类,当出现没有指定异常时此时对应捕获了Exception异常的方法会执行
@ExceptionHandler注解处理异常
1 | java复制代码@Controller |
优点:可以自定义异常信息存储的key,自定义跳转视图的名称
缺点:需要编写大量的异常处理方法,不能跨controller,如果两个controller中出现同样的异常,需要重新编写异常处理的方法
@ControllerAdvice+@ExceptionHandler 注解处理异常
1 | java复制代码/** |
优点:可以自定义异常信息存储的key,自定义跳转视图的名称,跨controller统一拦截统一捕获,一般都是使用这种
关注公众号猿人生了解更多好文
本文转载自: 掘金