统一异常处理

简介: 统一异常处理

实际我们在开发过程中可能需要做很多的判断校验,如果出现了非法情况我们是期望响应对应的提示

的。但是如果我们每次都自己手动去处理就会非常麻烦。我们可以选择直接抛出异常的方式,然后对异

常进行统一处理。把异常中的信息封装成 ResponseResult 响应给前端。

定义统一的异常类

我们需要定义服务中可能抛出的自定义异常类。这些异常类可以继承自RuntimeException,并携带有关异常的相关信息。即可理解为局部异常,用于特定的业务处理中异常。手动埋点抛出。

public class ZhiWenPlusException extends RuntimeException {
    private String errMessage;
 
    public ZhiWenPlusException() {
        super();
    }
 
    public ZhiWenPlusException(String errMessage) {
        super(errMessage);
        this.errMessage = errMessage;
    }
 
    public ZhiWenPlusException(AppHttpCodeEnum httpCodeEnum) {
        super(httpCodeEnum.getMsg());
        this.errMessage = httpCodeEnum.getMsg();
    }
 
    public String getErrMessage() {
        return errMessage;
    }
 
    public static void cast(CommonError commonError) {
        throw new ZhiWenPlusException(commonError.getErrMessage());
    }
 
    public static void cast(String errMessage) {
        throw new ZhiWenPlusException(errMessage);
    }
 
 
}

异常处理器

创建一个全局的异常处理器,使用@ControllerAdvice 或者 @RestControllerAdvice注解和@ExceptionHandler注解来捕获不同类型的异常,并定义处理逻辑。

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler(SystemException.class)
    public ResponseResult systemExceptionHandler(SystemException e) {
        //打印异常信息
        log.error("出现了异常! {}", e);
        //从异常对象中获取提示信息封装返回
        return ResponseResult.errorResult(e.getCode(), e.getMsg());
    }
 
    @ExceptionHandler(Exception.class)
    public ResponseResult exceptionHandler(Exception e) {
        //打印异常信息
        log.error("出现了异常! {}", e);
        //从异常对象中获取提示信息封装返回
        return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), e.getMessage());
    }
}

@ControllerAdvice注解

用于声明一个全局控制器建言(Advice),相当于把@ExceptionHandler、@InitBinder和@ModelAttribute注解的方法集中到一个地方。常放在一个特定的类上,这个类被认为是全局异常处理器,可以跨足多个控制器。

当使用@ControllerAdvice时,我们需要在异常处理方法上加上@ResponseBody,同理我们的web接口。但是如果我们使用@RestControllerAdvice 就可以不用加,同理也是web定义的接口

@ExceptionHandler注解

用于定义异常处理方法,处理特定类型的异常。放在全局异常处理器类中的具体方法上。

通过这两个注解的配合,可以实现全局的异常处理。当控制器中抛出异常时,Spring Boot会自动调用匹配的@ExceptionHandler方法来处理异常,并返回定义的响应。


目录
相关文章
|
存储 Java
【面试题精讲】为什么重写equals时必须重写hashCode方法?
【面试题精讲】为什么重写equals时必须重写hashCode方法?
|
网络架构
海康大华云台摄像机使用ONVIF无法控制云台问题
海康大华云台摄像机使用ONVIF无法控制云台问题
1086 1
|
存储 移动开发 算法
Python怎么将图片转换成base64编码
Python怎么将图片转换成base64编码
1133 10
|
缓存 Linux
【阿里云镜像】切换阿里巴巴开源镜像站镜像——Fedora镜像
【阿里云镜像】切换阿里巴巴开源镜像站镜像——Fedora镜像
2177 0
【阿里云镜像】切换阿里巴巴开源镜像站镜像——Fedora镜像
|
9月前
|
数据采集 人工智能 自然语言处理
一文读懂LLM微调:新手必知的原理、误区与场景化应用方案
本文深入浅出讲解LLM微调原理与实操,涵盖新手必知的核心概念、常见误区及场景化应用方案。通过类比“学霸特训”,解析微调与提示词区别,推荐轻量级LoRA方法,提供从数据准备、环境搭建到模型训练、效果评估的完整步骤,并附实用工具与避坑指南,助力AI初学者快速掌握定制化模型技能,实现个人或企业级AI应用落地。
|
存储 数据可视化 Java
基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪
Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用MicrometerTracing在微服务中作为服务追踪的工具。
1005 2
|
消息中间件 架构师 Java
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
|
存储 SQL 关系型数据库
MySQL 动态分区管理:自动化与优化实践
本文介绍了如何利用 MySQL 的存储过程与事件调度器实现动态分区管理,自动化应对数据增长,提升查询性能与数据管理效率,并详细解析了分区创建、冲突避免及实际应用中的关键注意事项。
596 0
|
文字识别 UED Python
对双栏 | 单双栏混合 | 图表文字混合的复杂布局的图片OCR识别(对布局复杂的整个pdf进行OCR识别)
这个故事告诉我们要多尝试不同的库和引擎,尤其是需求比较偏门或者少见的时候。同一个方向不同的库所擅长的领域是不一样的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~