SpringBoot全局异常处理 | Java

2024-02-26 1287阅读

温馨提示:这篇文章已超过404天没有更新,请注意相关的内容是否还可用!

⭐简单说两句⭐

作者:后端小知识

CSDN个人主页:后端小知识

🔎GZH:后端小知识

🎉欢迎关注🔎点赞👍收藏⭐️留言📝

文章目录

  • ✨SpringBoot全局异常处理 | Java
      • 🎨什么是全局异常?
      • 🍖如何使用全局异常
      • 🎯全局异常优缺点

        SpringBoot全局异常处理 | Java

        ✨SpringBoot全局异常处理 | Java

        亲爱的友友们,我们今天来讲一讲SpringBoot的全局异常处理吧😎

        🎨什么是全局异常?

        全局异常指的是在程序运行过程中发生的非预期异常,这些异常可能会导致程序崩溃或出现错误结果。全局异常处理机制可以捕获这些异常并进行相应的处理,如记录日志、提示用户等,从而提高程序的可靠性和稳定性。

        🍖如何使用全局异常

        【Tips】:我们这里的实现采用**@RestControllerAdvice与@ExceptionHandler**的方式进行实现,当然,读者们也可以自行根据切面去进行实现的啦😁

        我们先定义一个自定义异常(读者们可以看情况定义,也可以不定义哈)

        我们这里写得比较简洁,可以根据自己的业务进行定义的哈

        public class MyException extends RuntimeException{
            public MyException(String message) {
                super(message);
            }
        }
        

        自定义异常定义好了后,我们就需要定义全局异常处理器了

        我们先上代码,然后再来解释

        @RestControllerAdvice
        @Slf4j
        public class GlobalExceptionHandler {
            /**
             * 这里的return 信息会返回给前端
             */
            @ExceptionHandler(MyException.class)
            public String handleMyException(MyException e) {
                log.error("自定义MyException异常信息:{}", e.getMessage());
                return e.getMessage();
            }
            @ExceptionHandler(RuntimeException.class)
            public String handleMyException(RuntimeException e) {
                log.error("运行时异常信息:{}", e.getMessage());
                return e.getMessage();
            }
            @ExceptionHandler(ArithmeticException.class)
            public String handleMyException(ArithmeticException e) {
                log.error("算术异常信息:{}", e.getMessage());
                return e.getMessage();
            }
        }
        

        【Tips】

        @ExceptionHandler用这个注解来定义捕获什么样的异常。当抛出这些异常时,就会调用对应的方法。

        return的内容将会返回给前端

        当代码中出现算术异常时,日志会打印 算术异常信息:具体异常信息,并不会打印 运行时异常的日志,如果我们没有捕获ArithmeticException异常的这个方法的话,那么就会被RuntimeException捕获,会打印运行时异常:具体异常信息

        OK,我们接下来写Service的代码,这里方便演示,写得比较简洁,我就没有写dao层什么的连接数据库了,友友们在实践的时候可以试一试呢😁

        LearnExceptionService

        public interface LearnExceptionService {
            /**
             * 学习全局异常处理-自定义异常
             */
            Object learnException();
            /**
             * 学习全局异常处理-算术异常
             */
            Object learnAlException();
        }
        

        返回类型友友们根据具体情况写额,我这里写Object只是为了方便演示

        接口实现

        LearnExceptionServiceImpl

        @Service
        public class LearnExceptionServiceImpl implements LearnExceptionService {
            /**
             * 学习全局异常处理
             */
            @Override
            public Object learnException() {
                System.out.println("hello");
                throw new MyException("学习全局异常处理");
            }
            /**
             * 学习全局异常处理-算术异常
             */
            @Override
            public Object learnAlException() {
                int i = 1 / 0;
                return i;
            }
        }
        

        然后Controller层调用service层

        LearnExceptionController

        @Api("学习全局异常处理")
        @RestController
        @RequestMapping("exception")
        public class LearnExceptionController {
            @Resource
            private LearnExceptionService learnExceptionService;
            /**
             * 学习全局异常处理-自定义异常
             */
            @GetMapping("v1/global")
            public Object learnException() {
                return learnExceptionService.learnException();
            }
            /**
             * 学习全局异常处理-算术异常
             */
            @GetMapping("v1/global/al")
            public Object learnTheException() {
                return learnExceptionService.learnAlException();
            }
        }
        

        好咯,代码大工告成,接下来我们启动服务调用接口吧😛

        调用接口 /exception/v1/global,打印日志如下

        SpringBoot全局异常处理 | Java

        调用接口 /exception/v1/global/al,打印日志如下

        SpringBoot全局异常处理 | Java




        好了,我们来看个对比

        SpringBoot全局异常处理 | Java

        看了这个对比,你应该知道怎么选了吧😋

        全局异常可以减少大量的try catch语句,用了全局异常后,不用自己去try catch捕获异常了,直接走全局通用的捕获逻辑,当然,如果有特殊情况需要try catch捕获异常的话,那也是可以的,比如我们的自定义异常一般都是得手动捕获抛出异常

        OK,我们接下来总结一下全局异常的优缺点吧

        🎯全局异常优缺点

        优点:

        • 统一异常处理:可以集中处理所有类型的异常,使得代码更整洁,易于维护。
        • 提供更好的用户体验:可以为用户返回友好的错误信息,而不是展示复杂的技术错误。

          缺点:

          • 灵活性有限:如果某些特定类型的异常需要特殊处理,那么全局异常处理可能不是最佳选择。
          • 隐藏了一些重要的错误细节:对于开发人员来说,全局异常处理可能会掩盖一些关于异常具体位置和原因的信息。

            【都看到这了,点点赞点点关注呗,爱你们】😚😚

            SpringBoot全局异常处理 | Java

            结语

            谢谢你的阅读,由于作者水平有限,难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。

            写作不易,望各位老板点点赞,加个关注!😘😘😘

            💬

            作者:后端小知识

            CSDN个人主页:后端小知识

            🔎GZH:后端小知识

            🎉欢迎关注🔎点赞👍收藏⭐️留言📝

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]