前言

在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. 微服务集成redis并通过redis实现排行榜的功能

    默认你已经看过我之前的教程了,并且拥有上个教程完成的项目, 之前的教程 https://www.cnblogs.com/leafstar/p/17638933.html 由于redis的安装网上教程很 ...

  2. GitHub Deskhub使用

    (适合已经知道git是啥但是还不太熟到同学看-) GitHub deskhub就是一个图形化的github管理工具啦,比起来命令行使用舒服100倍哈哈哈- 链接:https://desktop.git ...

  3. 三维模型OSGB格式轻量化的纹理压缩和质量保持分析

    三维模型OSGB格式轻量化的纹理压缩和质量保持分析 在三维模型应用中,纹理数据是一个重要的部分,可以为模型增加更多的真实感和细节.但是,由于纹理数据通常会占用大量的存储空间和传输带宽,因此,在OSGB ...

  4. 使用flask开发web应用

    Flask环境搭建 要开发flash应用,我们需要做一些准备工作 我写了个初始化的脚本 Pip_init.sh来安装初始工作 可以到我的git上去下载该脚本进行初始化安装 要启动flask应用,我们需 ...

  5. Xshell7 / Xftp7 永久免费,官网直连下载地址

    主要目的是让大家随时随地从官网下载Xshell和Xftp免费版(个人/家庭/学校免费) 最新变动:官方目前仅提供最新版以及上一个版本的软件下载!其他版本不提供下载 免费版5版本(最后一个版本,无任何限 ...

  6. 2-MySQL基本语法

    上文说到,数据库的安装和连接,接下来将给大家讲解MySQL数据库的基本语法及数据的类型 1.基本语法 (1).查看当前所有数据库 : show databases; (2).创建数据库 create ...

  7. 6.1 KMP算法搜索机器码

    KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的.KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当 ...

  8. Redis面试——Redis面试精华知识

    从:Redis 使用场景与介绍 -> 数据结构与简单使用 -> 小功能大用处 -> 持久化.主从同步与缓存设计 -> 知识拓展 ,并且分析典型场景下常见的问题,并结合实战演练, ...

  9. 流水线中便捷迭代,鲲鹏DevKit 23.0新能力抢先看

    本文分享自华为云社区<鲲鹏DevKit 23.0:流水线中便捷迭代鲲鹏版本,迁移.开发.调优无缝衔接>,作者:华为云社区精选 . 数字时代,海量的行业应用驱动着多样性算力的飞速发展,以鲲鹏 ...

  10. codeforces #865 div1A

    A. Ian and Array Sorting 思路:首先我们可以从前往后做一遍,把除了最后一个元素其他所有数都变成和第一个数一样的数,然后假如前n-1个数个数为偶数,这样我们分组进行操作,一定可以 ...