前言

在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。

相关代码:

GlobalExceptionHandler类:

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler { /********************************
* @function : 自定义从捕捉
* @parameter : [e:CustomException | 自定义异常]
* @date : 2023/12/5 11:47
********************************/
@ExceptionHandler(value = CustomException.class)
public AjaxResult customExceptionHandler(HttpServletRequest request, CustomException e) {
log.error("业务异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
return new AjaxResult(e.getCode() , e.getMessage(), null);
} /********************************
* @function : 空指针异常捕捉
* @parameter : [e:Exception | 异常]
* @date : 2023/12/5 11:47
********************************/
@ExceptionHandler(value = Exception.class)
public AjaxResult exceptionHandler(HttpServletRequest request, Exception e) {
log.error("服务器内部异常异常,url:{}, 异常内容:{}" ,request.getRequestURI(), e);
return new AjaxResult(500 , e.getMessage(), null);
} }

自定义异常CustomException类:

@Slf4j
@Data
public class CustomException extends RuntimeException{ //错误码
private int code; //错误信息
private String message; public CustomException() {
super();
} public CustomException(ResultCodeEnum resultCodeEnum) {
super(String.valueOf(resultCodeEnum.getCode()));
this.code = resultCodeEnum.getCode();
this.message = resultCodeEnum.getMessage();
} }

通用返回类:AjaxResult

@Data
public class AjaxResult extends HashMap<String, Object> { // 状态码
private static final String CODE_TAG = "code"; // 返回消息
private static final String MSG_TAG = "message"; // 数据对象
private static final String DATA_TAG = "data"; public AjaxResult(int code, String message, Object data)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, message);
if (data != null)
{
super.put(DATA_TAG, data);
}
} /********************************
* @method : success
* @function : 返回成功消息(重载)
* @parameter :
* @return : AjaxResult
********************************/
public static AjaxResult success(){
return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null);
} /********************************
* @method : success
* @function : 返回成功消息(重载)
* @parameter : message : String | 返回消息
* @return : AjaxResult
********************************/
public static AjaxResult success(String message){
return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, null);
} /********************************
* @method : success
* @function : 返回成功消息(重载)
* @parameter : data : Object | 数据对象
* @return : AjaxResult
********************************/
public static AjaxResult success(Object data){
return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data);
} /********************************
* @method : success
* @function : 返回成功消息(重载)
* @parameter : message : String | 返回消息
* @parameter : data : Object | 数据对象
* @return : AjaxResult
********************************/
public static AjaxResult success(String message, Object data){
return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, data);
} /********************************
* @method : failed
* @function : 返回失败消息(重载)
* @parameter :
* @return : AjaxResult
********************************/
public static AjaxResult failed(){
return new AjaxResult(ResultCodeEnum.FAILED.getCode(), ResultCodeEnum.FAILED.getMessage(), null);
} /********************************
* @method : failed
* @function : 返回失败消息(重载)
* @parameter : message : String | 返回消息
* @return : AjaxResult
********************************/
public static AjaxResult failed(String message){
return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, null);
} /********************************
* @method : failed
* @function : 返回失败消息(重载)
* @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
* @return : AjaxResult
********************************/
public static AjaxResult failed(ResultCodeEnum resultCodeEnum){
return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null);
} /********************************
* @method : failed
* @function : 返回失败消息(重载)
* @parameter : message : String | 返回消息
* @parameter : data : Object | 数据对象
* @return : AjaxResult
********************************/
public static AjaxResult failed(String message, Object data){
return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, data);
} /********************************
* @method : failed
* @function : 返回失败消息(重载)
* @parameter : resultCodeEnum : ResultCodeEnum | 失败枚举类型
* @parameter : data : Object | 数据对象
* @return : AjaxResult
********************************/
public static AjaxResult failed(ResultCodeEnum resultCodeEnum, Object data){
return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
}
}

枚举类ResultCodeEnum:

public enum ResultCodeEnum {

    // 10??? 通用
SUCCESS(10000,"请求成功"),
FAILED(10008, "请求失败"),
FAILED_PARAM_ERROR(10009, "参数错误"),
...
private Integer code; private String message; ResultCodeEnum(Integer code, String message) {
this.code = code;
this.message = message;
} public int getCode(){
return code;
} public String getMessage(){
return message;
} }

使用:

在controller里面判断值是否异常,如果异常则直接抛出异常不进行执行,终止当前的流程,在service层也可以这样处理。


public AjaxResult getUserInfo(@RequestParam(value = "userId") Integer userId) {
if (userId == 0) {
throw new CustomException(ResultCodeEnum.NOT_EXIST_USER_ERROR);
}
...
}

再者是一些数值上的错误,比如除0,这种情况会被全局异常捕获,并返回相应的错误给到前端


@GetMapping("/test")
public AjaxResult test(){
int i = 60/0;
return AjaxResult.success();
}

springboot下添加全局异常处理和自定义异常处理的更多相关文章

  1. SpringBoot系列教程web篇之自定义异常处理HandlerExceptionResolver

    关于Web应用的全局异常处理,上一篇介绍了ControllerAdvice结合@ExceptionHandler的方式来实现web应用的全局异常管理: 本篇博文则带来另外一种并不常见的使用方式,通过实 ...

  2. 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解

    ========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...

  3. Java中的异常处理(三) - 自定义异常处理

    1.异常处理类 package second; public class MyException extends Exception { MyException (){ } MyException ( ...

  4. SpringBoot优雅的全局异常处理

    前言 本篇文章主要介绍的是SpringBoot项目进行全局异常的处理. SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要求 JD ...

  5. SpringBoot中的全局异常处理

    SpringBoot中的全局异常处理 本篇要点 介绍SpringBoot默认的异常处理机制. 如何定义错误页面. 如何自定义异常数据. 如何自定义视图解析. 介绍@ControllerAdvice注解 ...

  6. 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL

    本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...

  7. 线程问题、异常处理、自定义URL

    线程问题.异常处理.自定义URL   本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系 ...

  8. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  9. SpringBoot 2.x (5):异常处理与部署WAR项目

    异常处理: SpringBoot的异常处理是不友好的,前端只会显示最基本的错误名称 后端控制台会报出具体的错误,那么我们如何告知前端具体的错误信息呢? 1:对全局异常进行处理 一个测试的Control ...

  10. Spring Cloud实战 | 第九篇:Spring Cloud整合Spring Security OAuth2认证服务器统一认证自定义异常处理

    本文完整代码下载点击 一. 前言 相信了解过我或者看过我之前的系列文章应该多少知道点我写这些文章包括创建 有来商城youlai-mall 这个项目的目的,想给那些真的想提升自己或者迷茫的人(包括自己- ...

随机推荐

  1. 简单了解PyCharm

    简单了解PyCharm PyCharm的简单使用 修改主题 1 2 切换解释器 1 如何创建pythin文件 1 2 3 4 注释语法 行注释 这里是注释 块注释 '''这里是注释''' 常量和变量的 ...

  2. 从Google开发者大会浅谈LLM的应用

    这周参加了在上海世博中心举办Google I/O Connect中国开发者大会,有几年没参加这么高质量的活动,有点感慨. 期间重点听了关于GCP和Google AI大语言模型的主题演讲,发现目前各大厂 ...

  3. 2023年Vue开发中的8个最佳工具

    前言 Vue.js,一款当今非常流行的基于JavaScript的开源框架,旨在构建动态的可交互应用. Vue.js以其直观的语法和灵活的架构而广受全球开发者的欢迎和赞誉.随着时间的推移,Vue不断进化 ...

  4. 基于 Wiki.js 搭建知识库系统

    前言 本文介绍如何使用 Wiki.js 搭建知识库系统. Wiki.js 官网 安装 前提准备 Wiki.js 几乎可以在任何支持 Node.js 的系统上运行.它可以运行在 Linux .Windo ...

  5. java开发面试笔记

    目录 1.hashMap hashmap源码分析-逐行注释版: 2.线程池 3.MySQL数据库引擎.事务.锁机制 1. 引擎 2. 事务 索引 3. 锁: 4. 调优问题怎么回答? 4.SQL语句 ...

  6. 【AI 模型】首个 Joy 模型诞生!!!全民生成 Joy 大片

    接上一篇文章 "只要10秒,AI生成IP海报,解放双手",这次是全网第一个"共享joy模型",真的赚到了! 经过这段时间无数次的探索.试错.实验,最终积累了非常 ...

  7. Redis系列之——API的使用

    文章目录 一 通用命令 1.1 通用命令 1.2 数据结构和内部编码 1.3 单线程架构 1.3.1 单线程架构, 1.3.2 单线程为什么这么快 1.3.3 注意 二 字符串类型 2.1 字符串键值 ...

  8. centos服务器搭建https

    一.环境 OS:CentOS Linux release 8.2.2004 (Core) 硬件:某外网云服务器虚拟机 二.安装命令 1.安装nginx yum install nginx 2.安装签发 ...

  9. YbtOJ 质数与约数 4.统计元素

    搜不到题解,乐. 由题意,\(a_i\) 对答案有贡献当且仅当 \(i\in{[l,r]}\) 且对于 \(\forall a_j| {a_i},j\notin[l,r]\). 则对于每个 \(a_i ...

  10. Spring ---三种注入方式

    循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...