个人技术总结——全局异常处理

这个作业属于哪个课程2302软件工程
这个作业要求在哪里作业要求
这个作业的目标个人技术总结
其他参考文献《构建之法》

1 技术概述

1.1 技术介绍

在Spring Boot中,全局异常捕获能统一处理并响应应用程序中的异常,提高应用的健壮性、用户体验以及可维护性,通过自定义错误消息、日志记录以及支持多种响应格式等功能,实现优雅的错误处理。

1.2 学习原因

当项目越来越复杂时,异常可能来自多个不同的控制器或服务层。如果没有全局异常捕获,每个控制器或服务都需要单独处理异常,这会导致大量的重复代码和不一致的错误处理逻辑。全局异常捕获允许你定义统一的错误处理逻辑,确保无论异常发生在何处,都会得到相同的处理。当应用程序遇到异常时,如果直接抛出异常给前端用户,通常会显示一堆技术性的错误信息,这对于用户来说毫无意义,甚至可能引起恐慌。全局异常捕获可以捕获异常并返回友好的错误消息给前端用户,从而提高用户体验。

1.3 技术难点

确保全局异常处理能够覆盖到所有可能的异常。由于项目中可能存在各种复杂的业务逻辑和异常场景,因此必须确保全局异常处理能够捕获并处理所有潜在的异常,这需要对项目有深入的了解和对异常处理机制的熟练掌握。

合理设计异常处理逻辑,使得它既能满足业务需求,又能提供清晰的错误提示和日志记录。这需要对业务需求有准确的理解,并根据实际需求设计合适的异常处理逻辑。同时,还需要注意异常信息的保密性,避免将敏感信息泄露给用户。

根据不同的异常类型返回不同的响应也是技术难点之一。在实际应用中,可能需要根据异常类型返回不同的HTTP状态码和错误消息,以便前端或客户端能够正确地处理这些异常。这需要在全局异常处理中设计合适的映射关系,并确保映射关系的准确性和完整性。

2 技术详述

全局异常处理主要依赖于Spring Boot中的@ControllerAdvice或@RestControllerAdvice注解以及@ExceptionHandler方法。@ControllerAdvice是一个用于定义全局控制器行为的类级别注解,它可以与@ExceptionHandler结合使用,来指定哪些异常应该由特定的方法来处理。当控制器层(或其他被@ControllerAdvice注解覆盖的层)抛出异常时,Spring会查找匹配的@ExceptionHandler方法来处理该异常。可以定义多个@ExceptionHandler方法,每个方法处理不同类型的异常。例如,可以定义一个方法处理所有运行时异常(RuntimeException),另一个方法处理特定的自定义异常。每个@ExceptionHandler方法都接受一个异常参数,并返回一个响应对象(如ResponseEntity或自定义的响应DTO),该对象包含了错误码、错误消息以及可能的异常详情等字段。

3 问题与解决过程

问题:随着项目模块的增多,不同模块分别进行异常处理显得比较混乱,不方便较快定位到系统异常所在。

解决方法:使用全局异常处理

  • 创建异常处理类,返回到error页面
@ControllerAdvice
public class IMoocExceptionHandler {

    public static final String IMOOC_ERROR_VIEW = "error";

    @ExceptionHandler(value = Exception.class)
    public Object errorHandler(HttpServletRequest reqest, 
            HttpServletResponse response, Exception e) throws Exception {
        
        e.printStackTrace();
    
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.addObject("url", reqest.getRequestURL());
        mav.setViewName(IMOOC_ERROR_VIEW);
        return mav;
    }
}
  • ajax异常请求处理
@RestControllerAdvice
public class IMoocAjaxExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public IMoocJSONResult defaultErrorHandler(HttpServletRequest req, 
            Exception e) throws Exception {

        e.printStackTrace();
        return IMoocJSONResult.errorException(e.getMessage());
    }
}
  • 统一异常处理加一个判断
@ControllerAdvice
public class IMoocExceptionHandler {

    public static final String IMOOC_ERROR_VIEW = "error";
    @ExceptionHandler(value = Exception.class)
    public Object errorHandler(HttpServletRequest reqest, 
            HttpServletResponse response, Exception e) throws Exception {
        
        e.printStackTrace();
        
        if (isAjax(reqest)) {
            return IMoocJSONResult.errorException(e.getMessage());
        } else {
            ModelAndView mav = new ModelAndView();
            mav.addObject("exception", e);
            mav.addObject("url", reqest.getRequestURL());
            mav.setViewName(IMOOC_ERROR_VIEW);
            return mav;
        }
    }

    public static boolean isAjax(HttpServletRequest httpRequest){
        return  (httpRequest.getHeader("X-Requested-With") != null  
                    && "XMLHttpRequest"
                        .equals( httpRequest.getHeader("X-Requested-With").toString()) );
    }
}

4 总结

全局异常处理是Spring Boot中一项强大的技术,它允许开发者集中处理应用程序中抛出的所有异常,并确保异常得到统一、一致且恰当的处理。通过合理设计和使用全局异常处理,可以提高代码的可读性和可维护性,增强应用程序的健壮性和用户体验。

5 参考文献

Java全局异常处理器实现
java异常 | 处理规范、全局异常、Error处理
java全局异常处理

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值