全局异常处理

自定义异常

在应用开发过程中,除系统自身的异常外,不同业务场景中用到的异常也不一样,为了与标题 轻松搞定全局异常 更加的贴切,定义个自己的异常,看看如何捕获…

package com.baizhi.exception;public class CustomException extends RuntimeException {private static final long serialVersionUID = 4564124491192825748L;private int code;public CustomException() {super();}public CustomException(int code, String message) {super(message);this.setCode(code);}public int getCode() {return code;}public void setCode(int code) {this.code = code;}
}
复制代码

异常信息模板

定义返回的异常信息的格式,这样异常信息风格更为统一


public class ErrorResponseEntity {private int code;private String message;// 省略 get set
}
复制代码

异常处理(关键)

注解概述

  • @ControllerAdvice 捕获 Controller 层抛出的异常,如果添加 @ResponseBody 返回信息则为JSON格式。
  • @RestControllerAdvice 相当于 @ControllerAdvice@ResponseBody 的结合体。
  • @ExceptionHandler 统一处理一种类的异常,减少代码重复率,降低复杂度。

创建一个 GlobalExceptionHandler 类,并添加上 @RestControllerAdvice 注解就可以定义出异常通知类了,然后在定义的方法中添加上 @ExceptionHandler 即可实现异常的捕捉…

package com.baizhi.controller;
import com.baizhi.exception.CustomException;
import com.baizhi.exception.ErrorResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {/*** 定义要捕获的异常 可以多个 @ExceptionHandler({})** @param request  request* @param e        exception* @param response response* @return 响应结果*/@ExceptionHandler(CustomException.class)public ErrorResponseEntity customExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {response.setStatus(HttpStatus.BAD_REQUEST.value());CustomException exception = (CustomException) e;return new ErrorResponseEntity(exception.getCode(), exception.getMessage());}/*** 捕获  RuntimeException 异常* TODO  如果你觉得在一个 exceptionHandler 通过  if (e instanceof xxxException) 太麻烦* TODO  那么你还可以自己写多个不同的 exceptionHandler 处理不同异常** @param request  request* @param e        exception* @param response response* @return 响应结果*/@ExceptionHandler(RuntimeException.class)public ErrorResponseEntity runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {response.setStatus(HttpStatus.BAD_REQUEST.value());RuntimeException exception = (RuntimeException) e;return new ErrorResponseEntity(400, exception.getMessage());}/*** 通用的接口映射异常处理方*/@Overrideprotected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,HttpStatus status, WebRequest request) {if (ex instanceof MethodArgumentNotValidException) {MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;return new ResponseEntity<>(new ErrorResponseEntity(status.value(), exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status);}if (ex instanceof MethodArgumentTypeMismatchException) {MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex;logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName()+ ",信息:" + exception.getLocalizedMessage());return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);}return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);}
}
复制代码

Springboot全局异常处理GlobalExceptionHandler相关推荐

  1. springboot全局异常处理_SpringBoot:如何优雅地处理全局异常

    之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Contro ...

  2. springboot 全局异常处理类

    目录标题 springboot 全局异常处理类 依赖 代码 springboot 全局异常处理类 依赖 <!-- Spring Boot Web 依赖 核心 --><dependen ...

  3. SpringBoot 全局异常处理

    下面首先来观察一个程序代码,例如:现在建立一个控制器,而后这个控制器自己抛出一个异常.@Controller public class MemberController extends Abstrac ...

  4. SpringBoot全局异常处理

    1.为什么要全局异常处理 在实际开发中,如果不处理统一处理异常,那么前端在调用后端提供的接口,就会处理各种的异常结构,对于前端来说那可谓是一场灾难,这对前后端的协作也不友好.比如后端路径:/api/v ...

  5. [SpringBoot]全局异常处理

    2019独角兽企业重金招聘Python工程师标准>>> 1. 全局异常处理 2. SpringBoot错误处理原理 3. SpringBoot定制错误页面 4. SpringBoot ...

  6. SpringBoot全局异常处理及前端请求参数校验

    SpringBoot全局异常捕获处理及参数校验 文章目录 SpringBoot全局异常捕获处理及参数校验 为什么要用全局异常处理? 如何进行全局异常捕获和处理? 统一结果封装 统一返回结果 枚举类 使 ...

  7. springBoot 全局异常处理 报错 : Could not resolve method parameter at index 0 in public .....

    在学习 springboot 的全局异常处理时   ,我写了一个处理异常类 @ControllerAdvice public class ErrorCatchController {@Exceptio ...

  8. springboot 全局异常处理 自定义mvc错误页面展示

    如下:所有的异常都会进入到这里.根据个人业务按需处理 全局异常处理 @ControllerAdvice public class ErrorAdviceController {//指定捕获对象@Exc ...

  9. springboot全局异常处理详解

    对于全局异常需要认识两个注解 @RestControllerAdvice,@ExceptionHandler 1. @RestControllerAdvice 组成:@ControllerAdvice ...

  10. springboot全局异常处理BasicErrorController和RestControllerAdvice

    文章目录 RestControllerAdvice BasicErrorController ResponseBodyAdvice RestControllerAdvice @RestControll ...

最新文章

  1. vs连接mysql建一个表并增删查改_VS连接SQL Server数据库,增删改查详细教程(C#代码)...
  2. python线程的注意点(线程之间执行是无序的、主线程会等待所有的子线程执行结束再结束(守护主线程)、线程之间共享全局变量、线程之间共享全局变量数据出现错误问题(线程等待(join)、互斥锁))
  3. linux 运行多个docker,Docker 中如何连接多个 Container 协同工作
  4. Laravel表单提交419页面过期
  5. 怎么用python编程前二n-1项的等差数列的和_python 等差数列末项计算方式
  6. 【NOIP2013】【Luogu1980】计数问题
  7. win7做wifi服务器
  8. 使用.net开发手机管理软件 (九) 短信部分——PDU简介及其格式
  9. 在线教学战“疫”打响,VIPKID背后是阿里云
  10. 平面设计计算机基本配置,平面设计电脑配置要求
  11. 关键词组合工具_凭技术做外贸:关键词优化的高效工具推荐
  12. EffectiveJava3翻译 中英双语对照版
  13. 一款桌面整理软件——Fences
  14. python requests接收chunked编码问题
  15. 乐玩插件和大漠插件哪个好_2019年都用过哪些Chrome插件?分享30个好用的插件,提升上网体验...
  16. 2万字软件测试面试题干货带答案,反手我就一个收藏
  17. 红米note3 S线刷MUI版本,解决手机卡顿
  18. 免费简单的为域名申请SSL证书
  19. jzoj 4246【五校联考6day2】san
  20. ctrl+alt+t 函数注释快捷键失效KoroFileHeader

热门文章

  1. 实现简单的Java内存缓存
  2. 直击前沿技术:云原生应用低代码开发平台实践
  3. 10分钟就能搭建远程开发环境?你早点怎么不出现(#`n´)!
  4. 程序设计实践(评注版) 评注者序
  5. MYOP究竟能为站长提供哪些便利
  6. 5.4 tensorflow2实现消除多重共线性、人均网络消费回归分析——python实战
  7. Python如何从一个文件中调用另一个文件的类
  8. 【Leetcode】打家劫舍 I and 打家劫舍 II(动态规划)PYTHON
  9. lstm 做多分类loss完全不下降_使用Induction Network做Few-Shot Text分类
  10. python多线程学了多久_Python多线程一学就会!