这个作业属于哪个课程 | 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中一项强大的技术,它允许开发者集中处理应用程序中抛出的所有异常,并确保异常得到统一、一致且恰当的处理。通过合理设计和使用全局异常处理,可以提高代码的可读性和可维护性,增强应用程序的健壮性和用户体验。