码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JAVA全局异常处理


    目录

     1、问题引入

    2、代码编写


     1、问题引入

    我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:

    1. 使用 try...catch 直接进行异常捕获,但是这种方式太繁琐了,难不成我有一个异常我就要写一次try...catch吗?虽然可以解决,但是存在弊端代码冗余,不通用。
    2. 使用异常处理器进行全局异常捕获,采用这种方式来实现,我们只需要在项目中定义一个通用的全局异常处理器,就可以解决本项目的所有异常。

    2、代码编写

    在项目中自定义一个全局异常处理器,在异常处理器上加上注解 @ControllerAdvice,可以通过属性annotations指定拦截哪一类的Controller方法。

    创建好全局异常处理器后,我们就可以去编写异常处理方法。

    1. import lombok.extern.slf4j.Slf4j;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.ControllerAdvice;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.bind.annotation.ResponseBody;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import java.sql.SQLIntegrityConstraintViolationException;
    8. /**
    9. * 全局异常处理
    10. */
    11. @ControllerAdvice(annotations = {RestController.class, Controller.class})
    12. @ResponseBody
    13. @Slf4j
    14. public class GlobalExceptionHandler {
    15. /**
    16. * 异常处理方法 @ExceptionHandler 来指定拦截的是那一类型的异常。
    17. * @return
    18. */
    19. @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    20. public R exceptionHandler(SQLIntegrityConstraintViolationException ex){
    21. // 打印异常信息 例如 : Duplicate entry '666' for key 'idx_username'
    22. log.error(ex.getMessage());
    23. // 判断异常信息是否包括
    24. if(ex.getMessage().contains("Duplicate entry")){
    25. // 异常信息有空格,所以我们可以通过空格进行截取 获得一个数组
    26. String[] split = ex.getMessage().split(" ");
    27. String msg = split[2] + "已存在";
    28. // 返回异常处理信息
    29. return R.error(msg);
    30. }
    31. return R.error("未知错误");
    32. }
    33. }

    上述的全局异常处理器上使用了的两个注解 @ControllerAdvice , @ResponseBody , 他们的作用分别为:

    1. @ControllerAdvice : 指定拦截那些类型的控制器;
    2. @ResponseBody: 将方法的返回值 R 对象转换为json格式的数据, 响应给页面;

    上述使用的两个注解, 也可以合并成为一个注解 @RestControllerAdvice

  • 相关阅读:
    事件循环面试题如何去回答?
    [flume]组成|source|channel|事务|拦截器|选择器|处理器|监控器|数据丢失问题|如何保证数据的完整性
    [谷粒商城笔记]07、Linux环境-虚拟机网络设置
    工具篇 | WSL使用入门教程以及基于WSL和natApp内网穿透实践 - 对比VMWare
    从0搭建Vue3组件库(十):如何搭建一个 Cli 脚手架
    vue中使用xlsx插件导出多sheet excel实现方法
    leetcode - 218. The Skyline Problem
    前端数据可视化之【series、series饼图配置】配置项
    【CentOS 】DHCP 更改为静态 IP 地址并且遇到无法联网
    tomcat服务搭建(多实例部署和Nginx+Tomcat负载均衡、动静分离)
  • 原文地址:https://blog.csdn.net/weixin_53041251/article/details/126855725
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号