1、统一异常处理类 package cn.hadron.controller; import org.springframework.web.bind.annotation.ControllerAdvice import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; /** * 统一异常处理类 @ResponseBody public String test(String name) throws Exception{ System.out.println("异常处理测试 div class="container">
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"); } } 然后造一个异常 ,就可以处理了。
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); } } 如果我们只相对控制器添加统一的异常捕获程序
是什么 @RestControllerAdvice 统一异常处理 @RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成 为什么要有这个注解 对于异常处理情况,我们也需要统一成上面的格式。 如果我们在controller中通过try catch来处理异常的话,会出现一个问题就是每个函数里都加一个Try catch,代码会变的很乱。 下面我们就通过spring boot的注解来省略掉controller中的try-catch 帮助我们来封装异常信息并返回给前端,这样用户也不会得到一些奇奇怪怪的错误提示。 需要对请求对象进行判断 ,这里直接在BrandEntity 这个类上用 /** * jsr303 * 1)给bean添加校验注解,并定义自己的message提示 * 2)开启校验功能@valid
统一异常拦截处理方式 项目中不可避免会出现一些异常情况,而一个web项目,若不拦截异常,糟糕的情况下可能直接将堆栈抛给前端,从而导致各种鬼畜的问题 I. 借助@ControllerAdvice拦截异常 给一个简单的demo,便可以很容易的了解这种手段如何处理了 @ControllerAdvice @Slf4j @ResponseBody public class StringUtils.isBlank(e.getMessage())) { return ResponseWrapper.errorReturn(new Status(500, "内部异常
SpringBoot统一异常处理01、分析统一跳转:/error 这是一种全局的机制配置类:补充状态进行跳转 – 局部的机制自定义页面的方式,方便我们可以把error.html随心所欲的进行存放问题:其实给开发增大的工作量 myError"; }}@ControllerAdvice 和 @RestControllerAdvice底层原理是:AOP 主要用于开启全局异常处理一种机制,对后面的统一返回,统一异常处理,统一参数注入都会用这个 因为在程序开发中,不仅仅只有页面返回处理。如果单体项目,有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 #!
这里直接给出一些结论: 受检异常,需要使用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统一处理异常有三种方式 @ExceptionHandler 使用@ExceptionHandler注解作用在方法上面,参数是具体的异常类型。 ,请联系管理员"), MyError1("001","自定义异常1"), MyError2("002","自定义异常2"), MyError3("003","自定义异常3"); : (1)SpringMVC会先从配置文件找异常解析器HandlerExceptionResolver (2)如果找到了异常异常解析器,那么接下来就会判断该异常解析器能否处理当前发生的异常 (3)如果可以处理的话
全局异常处理 创建异常类,编写测试方法 @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("自定义异常处理") // 这样写会被挨打吗?
统一返回数据结构 定义接口返回数据结构 先定义接口返回数据结构,code为0表示操作成功,非0表示异常。 result.setCode(code); result.setMessage(message); return result; } } 统一异常处理 } public void setCode(Integer code) { this.code = code; } } @ControllerAdvice统一处理异常 @ExceptionHandler,拦截异常,方法里的value是指需要拦截的异常类型,通过该注解可实现自定义异常处理。 ; } } } 测试 测试正常返回及空指针系统异常 修改Usercontroller.java类,在查询用户列表接口增加返回值处理,如下所示: /** * 查询用户列表 *
使用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; } } 第五步,创建统一处理异常的类
BasicErrorController SpringBoot内置了一个BasicErrorController对异常进行统一的处理,当在页面发生异常的时候会自动把请求转到/error(Spring Boot 定义全局异常处理类:并用@ControllerAdvice注解 返回视图,新建方法defaultErrorHandler 用@ExceptionHandler注解 返回JSON,新建方法 用jsonErrorHandler 自定义异常类 继承Exception(或RuntimeException) ? 页面 ? 如果全部异常处理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,这样在方法上就可以不需要添加 @ResponseBody。 总结 ?
} @Override public String getErrorPath() { return ERROR_PATH; } } 以上定义了一个统一的返回类 :UserController have exception" } 0x02:区别 注解@ControllerAdvice方式只能处理控制器抛出的异常。 类ErrorController方式可以处理所有的异常,包括未进入控制器的错误,比如404、401等错误 如果应用中两者共同存在,则@ControllerAdvice方式处理控制器抛出的异常,类ErrorController 方式未进入控制器的异常。 @ControllerAdvice方式可以定义多个拦截方法,拦截不同的异常类,并且可以获取抛出的异常信息,自由度更大。
所以我们就得将异常进行处理。 思考 各个层级均出现异常,异常处理代码书写在哪一层? 所有的异常均抛出到表现层进行处理 异常的种类很多,表现层如何将所有的异常都处理到呢? AOP 对于上面这些问题及解决方案,SpringMVC 已经为我们提供了一套解决方案: 异常处理器: 集中的、统一的处理项目中出现的异常。 2. } } 确保 SpringMvcConfig 能够扫描到异常处理器类 步骤 2:让程序抛出异常 修改BookController 的 getById 方法,添加int i = 1/0. 和 SystemException 的定义 2.将其他异常包装成自定义异常类型 3.在异常处理器类中对不同的异常进行处理 步骤 1:自定义异常类 //自定义异常处理器,用于封装异常信息,对异常进行分类 步骤 2:将其他异常包成自定义异常 假如在 BookServiceImpl 的 getById 方法抛异常了,该如何来包装呢?
正文 下面我要对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)拦截器 统一返回结果 既然要统一进行异常处理了,自然需要统一下数据结果的返回格式,这里建议使用一个实体类进行处理,更加的可控易于管理修改。 { int i = 9 / 0; } } AOP处理异常 使用AOP切controller类,进行统一的异常处理。
三、异常的传递3.1概念:异常的传递——当函数/方法执行出现异常,会即将异常 传递给函数/方法的调用一方,如果传递到主程序仍然没有异常处理,程序才会被终止。 ,第五行代码是在调用demo1这个函数,把这个异常交到了主程序print(demo1()),而这个主程序并没有做异常处理,所以主程序才会被终止。 之后并没有在demo2函数内部处理异常,既然没有处理异常就会把这个异常继续向上传递,传递给代码的第九行,第九行是在主程序中调用demo2这个函数。 这个就是异常一级一级传递的过程,如果某个函数出现了异常,会把这个异常向上传递,传递给这个函数的调用一方,一直传递到主程序之后如果发现异常没有被处理程序才会被终止。 示例:需求:提示用户输入密码,如果长度少于8,抛出异常注意:当前函数只负责提示用户输入密码,如果密码长度不正确,需要其他函数进行额外处理。因此可以抛出异常,由其他需要处理的函数捕获异常。