前言

在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. 一文了解 history 和 react-router 的实现原理

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霜序 前言 在前一篇文章中,我们详细的说了 react-r ...

  2. VA01/VA02/VA03/VA05 销售订单隐藏价格

    1.业务需求 针对用户使用销售订单时,判断是否有权限,没有权限时隐藏销售订单抬头和行项目的价格相关字段 2.增强实现 2.1.隐藏抬头和行项目价格 隐藏抬头和行项目表格中的净值和净价字段 在程序MV4 ...

  3. AI绘画Stable Diffusion实战操作: 62个咒语调教-时尚杂志封面

    今天来给大家分享,如何用sd简单的咒语输出好看的图片的教程,今天做的是时尚杂志专题,话不多说直入主题. 还不会StableDiffusion的基本操作,推荐看看这篇保姆级教程: AI绘画:Stable ...

  4. Kioptrix Level 1

    Kioptrix这个系列靶机默认是桥接模式,如果我们kali使用NAT是扫描不到靶机的,通过VM的靶机网络设置也不能更改成功. 解决方式:每次下载好靶机先不导入VM,如果已经导入,需要"移除 ...

  5. stencilJs学习之构建 Drawer 组件

    前言 在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop.State.Event.Listen.Method.Component 以及生命周期方法.这些 ...

  6. API接口设计规范,看这篇就足以了

    ​ 优秀的设计是产品变得卓越的原因.设计API意味着提供有效的接口,可以帮助API使用者更好地了解.使用和集成,同时帮助人们有效地维护它.每个产品都需要使用手册,API也不例外. 在API领域,可以将 ...

  7. 通过API接口获取到数据后的使用方法以及储存方法

    API接口是许多应用程序和服务所必需的,可以将多个应用程序连接起来,允许不同应用程序之间的数据共享.在本文中,我们将探讨如何使用API接口获取数据,以及如何储存这些数据. 1.使用API接口获取数据 ...

  8. sqoop1.4.7完全支持Hadoop3.x, Hive3.x Hbase2.x

    已经修改好 保存至云盘 自己下载 花了时间的,记得关注我... 链接:https://pan.xunlei.com/s/VNe6P6Tm1A9Q-RG5GByN08rdA1# 提取码:5nke 复制这 ...

  9. 小知识:vi 查找如何不区分大小写

    在使用vi查找数据库的truncate记录日志时,发现对应语句夹杂了大小写,不够规范: 而vi默认查找是区分大小写的,如何不区分大小写查找指定内容呢? 有两种方式: (1)在查找指令后面额外加上\c标 ...

  10. Python socket实现简单聊天,同步输入和接收消息

    查的资料很多都是必须等待接收数据后才能再次输入.做了修改,使用多线程的形式,实现一边输入,一边接收 服务端代码 import socket import threading import sys im ...