Spring MVC处理异常有3种方式: (1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; (2)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器; (3)使用@ExceptionHandler注解实现异常处理; 但是方式一仅能获取到异常信息,方式三对已有代码存在入侵性。 实现HandlerExceptionResolver 接口异常处理器 1、增加HandlerExceptionResolver 接口的实现类MyExceptionHandler,代码如下: public 实现定义的异常类即可: public class BusinessException extends RuntimeException { /** serialVersionUID String message, Throwable cause) { super(message, cause); } } 如果我们只相对控制器添加统一的异常捕获程序
org.springframework.web.bind.annotation.ExceptionHandler; /** * @author : zanglikun * @date : 2021/3/11 13:54 * @Version: 1.0 * @Desc : AOP 思想 统一异常处理 */ @ControllerAdvice public class UnitonException { // 拦截 异常 到 @ExceptionHandler(myExpection.class oneException(myExpection e){ return ResponseEntity.badRequest().body("hello,world"); } } 然后造一个异常 ,就可以处理了。
是什么 @RestControllerAdvice 统一异常处理 @RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成 ControllerAdvice和RestControllerAdvice的区别 两者都是全局捕获异常,但是RestControllerAdvice更加强大,其作用相当于ControllerAdvice 为什么要有这个注解 对于异常处理情况,我们也需要统一成上面的格式。 如果我们在controller中通过try catch来处理异常的话,会出现一个问题就是每个函数里都加一个Try catch,代码会变的很乱。 下面我们就通过spring boot的注解来省略掉controller中的try-catch 帮助我们来封装异常信息并返回给前端,这样用户也不会得到一些奇奇怪怪的错误提示。
SpringBoot统一异常处理01、分析统一跳转:/error 这是一种全局的机制配置类:补充状态进行跳转 – 局部的机制自定义页面的方式,方便我们可以把error.html随心所欲的进行存放问题:其实给开发增大的工作量 ,对后面的统一返回,统一异常处理,统一参数注入都会用这个@ControllerAdvice。 因为在程序开发中,不仅仅只有页面返回处理。如果单体项目,有freemarker 和 thymeleaf的话其实使用@ControllerAdvice做统一异常处理能够满足错误处理机制。 所以我们把统一异常处理的类GlobalExceptionControllerHandler当做Controller去对待就对了。 05、统一返回为什么是R类,而不是Map或者Object原因如:Map不具备面向对象的特征Object 不明确类型。建议自己去定义一个统一返回来处理统一异常。
概述 在项目中统一异常处理,可以防止代码中有未捕获的异常出现。本文介绍如何在 Django 项目中进行统一异常的处理,再结合状态码枚举类对项目异常信息进行日志记录。 Django 统一异常处理 在 Django 项目中可以自定义 中间件类 继承 django.middleware.common 下的 MiddlewareMixin 中间件类,重写 process_exception 方法的异常处理逻辑,然后在项目配置下的 中间件中注册 即可进行全局异常处理。 统一异常处理具体设计 结合自定义的异常和状态码枚举类,进行异常日志信息和业务逻辑的处理。 自定义异常模块 # exceptions.py #! _data } return context 完善统一异常处理逻辑 # middlewares.py #!
统一异常拦截处理方式 项目中不可避免会出现一些异常情况,而一个web项目,若不拦截异常,糟糕的情况下可能直接将堆栈抛给前端,从而导致各种鬼畜的问题 I. 借助@ControllerAdvice拦截异常 给一个简单的demo,便可以很容易的了解这种手段如何处理了 @ControllerAdvice @Slf4j @ResponseBody public class StringUtils.isBlank(e.getMessage())) { return ResponseWrapper.errorReturn(new Status(500, "内部异常
这里直接给出一些结论: 受检异常,需要使用try来包裹可能会抛出异常的代码块,catch用于捕获异常并处理异常的代码块,常见的处理策略包括:打印错误日志、抛出自定义业务异常、释放资源、设置局部变量等 受检异常 业务开发中,通常在Service层抛出自定义业务异常,然后在Controller层统一捕获异常并返回errCode和errMsg 不管有没有出现异常,finally仍然会执行 当try和catch中有return 在操作系统里,这个target也称为异常处理程序。就是特定问题出现时,去异常表查询这个问题对应的是哪个处理程序,然后去执行这个程序,完成异常处理。 Spring MVC全局异常处理 每个Controller层里的方法都需要进行异常捕获及处理,显然太繁琐且效率低。 ,否则统一归为系统异常 Map<String, Object> map = new HashMap<>(); map.put("success", false);
data => { console.log(data); }); getData('users').then(data => { console.log(data); }); 但是上面没有对异常进行处理 ,为了进行方便的统一异常处理,可以修改返回的promise对象的then方法,自动将统一的错误处理handler加入。
在项目开发中各层中都会不可避免的遇到各种可预知和不可预知的异常需要处理,为只专注业务逻辑的实现,需要将异常信息进行统一管理维护处理。 springmvc就是将异常层层向外抛出,最后由springmvc的前端控制器调用异常处理组件HandlerExceptionResolver(处理器异常解析器)进行处理 —————————————— —— 统一处理某一类异常,能够减少代码的重复度和复杂度,有利于代码的维护。 springmvc统一处理异常有三种方式 @ExceptionHandler 使用@ExceptionHandler注解作用在方法上面,参数是具体的异常类型。 ,那么就进行处理,然后给前台返回对应的异常视图 (4)如果没有找到对应的异常解析器或者是找到的异常解析器不能处理当前的异常的时候,就看当前的Controller中有没有提供对应的异常处理器,如果提供了就由
使用Spring Boot统一处理异常。 本文实例是从数据库中根据ID查询学生信息,要求学生的年龄在14——20岁之间。小于14岁,提示“你可能在上初中”;大于20岁,提示“呢可能在上大学”。 第一步,创建枚举类ResultEnum,用来管理异常信息 package *;//自己定义 public enum ResultEnum { UNKONW_ERROR(-1, "未知错误"), return code; } } 第三步,创建返回报文实体类Result.java package *;//自己定义 import *.Result; //自己定义的路径 /** * HTTP请求返回处理工具类 result; } } 第四步,创建请求返回工具类ResultUtil.java package *;//自己定义 import *.Result;//自己定义的路径 /** * HTTP请求返回处理工具类 Result(); result.setCode(code); result.setMsg(msg); return result; } } 第五步,创建统一处理异常的类
统一返回数据结构 定义接口返回数据结构 先定义接口返回数据结构,code为0表示操作成功,非0表示异常。 result.setCode(code); result.setMessage(message); return result; } } 统一异常处理 } public void setCode(Integer code) { this.code = code; } } @ControllerAdvice统一处理异常 @ExceptionHandler,拦截异常,方法里的value是指需要拦截的异常类型,通过该注解可实现自定义异常处理。 ; } } } 测试 测试正常返回及空指针系统异常 修改Usercontroller.java类,在查询用户列表接口增加返回值处理,如下所示: /** * 查询用户列表 *
全局异常处理 创建异常类,编写测试方法 @ControllerAdvice public class GlobalExceptionHandler { @ApiOperation("全局异常处理 Result error(Exception e) { e.printStackTrace(); return Result.fail(null).message("执行了全局处理异常 ); int a = 10 / 0; return Result.ok(list).message("查询成功").code(200); } } 特定异常处理 创建异常类,编写测试方法 @ControllerAdvice public class GlobalExceptionHandler { @ApiOperation("特定异常处理") / GlobalExceptionHandler { @ApiOperation("自定义异常处理") // 这样写会被挨打吗?
} @Override public String getErrorPath() { return ERROR_PATH; } } 以上定义了一个统一的返回类 :UserController have exception" } 0x02:区别 注解@ControllerAdvice方式只能处理控制器抛出的异常。 类ErrorController方式可以处理所有的异常,包括未进入控制器的错误,比如404、401等错误 如果应用中两者共同存在,则@ControllerAdvice方式处理控制器抛出的异常,类ErrorController 方式未进入控制器的异常。 @ControllerAdvice方式可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大。
BasicErrorController SpringBoot内置了一个BasicErrorController对异常进行统一的处理,当在页面发生异常的时候会自动把请求转到/error(Spring Boot 定义全局异常处理类:并用@ControllerAdvice注解 返回视图,新建方法defaultErrorHandler 用@ExceptionHandler注解 返回JSON,新建方法 用jsonErrorHandler 自定义异常类 继承Exception(或RuntimeException) ? 页面 ? 如果全部异常处理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,这样在方法上就可以不需要添加 @ResponseBody。 总结 ?
所以我们就得将异常进行处理。 思考 各个层级均出现异常,异常处理代码书写在哪一层? 所有的异常均抛出到表现层进行处理 异常的种类很多,表现层如何将所有的异常都处理到呢? AOP 对于上面这些问题及解决方案,SpringMVC 已经为我们提供了一套解决方案: 异常处理器: 集中的、统一的处理项目中出现的异常。 2. 作用 设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行 说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常 3. 项目异常处理方案 3.1 异常分类 异常处理器我们已经能够使用了,那么在咱们的项目中该如何来处理异常呢? 和 SystemException 的定义 2.将其他异常包装成自定义异常类型 3.在异常处理器类中对不同的异常进行处理 步骤 1:自定义异常类 //自定义异常处理器,用于封装异常信息,对异常进行分类
正文 下面我要对springboot(1.5.8.RELEASE)中异常拦截处理进行讲解。 根据自己特定需要,配置对什么样的异常进行拦截处理,我只写了两种校验。 /** * 统一拦截异常 * * @author yanlin * @version v1.3 * @date 2018-10-18 下午2:27 * @since v8.0 **/ @RestControllerAdvice ,每一个记录都有4个信息(try catch的开始地址,结束地址,异常的处理起始位,异常类名称)。 当代码在运行时抛出了异常时,首先拿着抛出位置到异常表中查找是否可以被catch(例如看位置是不是处于任何一栏中的开始和结束位置之间),如果可以则跑到异常处理的起始位置开始处理,如果没有找到则原地return
通过统一异常处理,可以有效地对应用程序中的异常进行管理和处理,提高用户体验和代码的可维护性。 本文将深入探讨@ExceptionHandler的用法和原理,并结合实际项目场景,介绍如何在Spring MVC应用中实现统一异常处理的最佳实践。 最佳实践 在使用@ExceptionHandler进行统一异常处理时,需要考虑以下最佳实践: 精确定义异常: 尽可能精确地定义自定义异常,以便能够区分不同类型的异常情况。 合理划分处理逻辑: 根据实际业务需求,将不同类型的异常分别处理,避免处理逻辑过于复杂。 使用全局异常处理器: 创建全局异常处理器来捕获未被特定方法处理的异常,提供统一的错误处理方式。 通过本文的深入解析和实例,读者可以更好地掌握@ExceptionHandler的用法和原理,并在实际项目中运用统一异常处理的最佳实践。
前言 简单回顾下异常分类: 非受检异常:运行时异常 受检异常:编译时异常 异常的处理通常有两种方式: 第一种就是在当前类使用try-catch捕获异常并直接处理 另一种就是不在当前类处理,使用throws 所以,一般来说除非的必须在在当前类处理的异常,否则都会向上抛出,直到抛到controller层为止,在controller层进行统一的异常处理(不处理的话,再往上抛就抛到前端去了)。 统一进行异常处理的常见方式有两种:1. 使用注解 或者 2. 使用(AOP)拦截器 统一返回结果 既然要统一进行异常处理了,自然需要统一下数据结果的返回格式,这里建议使用一个实体类进行处理,更加的可控易于管理修改。 使用AOP切controller类,进行统一的异常处理。
能否将这些重复的部分抽取出来,这样保证Controller层更专注于业务逻辑的处理, 同时能够使得异常的处理有一个统一的控制中心点。 1. 全局异常处理 1.1. ,会被该异常处理方法处理。 这也是ControllerAdvice进行统一异常处理的优点,它能够细粒度的控制该异常处理器针对哪些Controller有效,这样的好处是: 一个系统里就能够存在不同的异常处理器,Controller也可以有选择的决定使用哪个 就我个人而言,由于ControllerAdvice具有更细粒度的控制能力,所以我更偏爱于在系统中使用ControllerAdvice进行统一异常处理。 当然,理论上,任何能够给Controller加切面的机制都能变相的进行统一异常处理。比如: 在拦截器内捕获Controller的异常,做统一异常处理。 使用Spring的AOP机制,做统一异常处理。
借助该注解,我们可以实现:在独立的某个地方,比如单独一个类,定义一套对各种异常的处理机制,然后在类的签名加上注解@ControllerAdvice,统一对 不同阶段的、不同异常 进行处理。 统一异常处理实战 注:因为整个统一异常处理方案涉及的代码比较多,这里不方便贴出所有代码,只会贴出关键部分,所以建议将源码clone到本地方便查看。 在定义统一异常处理类之前,先来介绍一下如何优雅的判定异常情况并抛异常。 捕获404对应的异常 统一返回结果 在验证统一异常处理器之前,顺便说一下统一返回结果。说白了,其实是统一一下返回结果的数据结构。 验证统一异常处理 因为这一套统一异常处理可以说是通用的,所有可以设计成一个 common包,以后每一个新项目/模块只需引入该包即可。所以为了验证,需要新建一个项目,并引入该 common包。