• SpringMVC 学习(十)之异常处理


    目录

    1 异常处理介绍        

    2 通过 SimpleMappingExceptionResolver 实现

    3 通过接口 HandlerExceptionResolver 实现

    4 通过 @ExceptionHandler 注解实现(推荐)


    1 异常处理介绍        

            在 SpringMVC中,异常处理器(Exception Handler)用于处理应用程序中发生的异常。SpringMVC 提供的异常处理主要有以下三种方式:

    • 使用 SpringMVC 提供的简单异常处理器 SimpleMappingExceptionResolver
    • 实现异常处理接口 HandlerExceptionResolver
    • 使用 @ExceptionHandler 注解实现异常处理

    2 通过 SimpleMappingExceptionResolver 实现

    SimpleMappingExceptionResolver 异常处理器是 SpringMVC 定义好的异常处理器,具有以下特点。

    • 优点:集成简单、有良好的扩展性、对已有代码没有入侵性等
    • 缺点:该方法仅能获取到异常信息,对需要获取除异常以外的数据的情况不适用

    在 SpingMVC 的配置文件中配置 SimpleMappingExceptionResolver 异常处理器

    1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="exceptionResolver">
    2. <property name="exceptionAttribute" value="exception">property>
    3. <property name="exceptionMappings">
    4. <props>
    5. <prop key="java.lang.ArithmeticException">show-messageprop>
    6. <prop key="java.lang.RuntimeException">show-runtime-messageprop>
    7. <prop key="java.lang.Exception">show-exception-messageprop>
    8. props>
    9. property>
    10. <property name="defaultErrorView" value="error">property>
    11. bean>

    模拟异常的控制方法

    1. @Controller
    2. public class ExceptionController {
    3. @RequestMapping("/exception")
    4. public void test() {
    5. // 触发 ArithmeticException 异常
    6. int result = 1 / 0;
    7. }
    8. }

    show-message.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>异常信息页面title>
    5. head>
    6. <body>
    7. <h1>系统信息h1>
    8. 异常对象:${requestScope.exception}<br/>
    9. 异常消息:${requestScope.exception.message}<br/>
    10. body>
    11. html>

    执行结果

    3 通过接口 HandlerExceptionResolver 实现

    自定义异常处理器类

    1. public class CustomExceptionHandler implements HandlerExceptionResolver {
    2. @Override
    3. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
    4. Exception ex) {
    5. // 处理异常的逻辑
    6. // 可以设置错误视图、返回错误代码、记录异常信息等
    7. ModelAndView modelAndView = new ModelAndView("show-message");
    8. modelAndView.addObject("exception", ex);
    9. return modelAndView;
    10. }
    11. }

    在 SpringMVC 配置文件中配置异常处理器

    <bean class="com.controller.CustomExceptionHandler">bean>

    奇怪了,Exception exception 有 getMessage() 方法,没有 exception.message,结果没报错

    4 通过 @ExceptionHandler 注解实现(推荐)

    @ControllerAdvice 注解是 Spring Framework 中的一个注解,用于标识一个类为全局的控制器 advice (控制器增强)
    使用 @ControllerAdvice 注解的类可以提供以下功能:

    • 全局异常处理:可以使用 @ExceptionHandler 注解在 @ControllerAdvice 类中定义异常处理方法,以处理控制器中抛出的异常。这些方法可以捕获特定的异常类型,并返回相应的响应,如错误页面或错误信息
    • 全局数据验证:可以使用 @InitBinder 注解在 @ControllerAdvice 类中定义数据绑定初始化方法,以在请求处理之前对参数进行验证或自定义数据绑定规则
    • 全局拦截器:可以使用 @Interceptor 注解在 @ControllerAdvice 类中定义拦截器方法,以拦截所有控制器方法的调用,并在调用之前或之后执行额外的操作,如日志记录、权限检查等
    • 统一响应处理:可以使用 @ResponseBody 注解在 @ControllerAdvice 类中定义响应处理方法,以统一处理控制器方法的返回值,并将其转换为合适的响应格式,如 JSON 或 HTML

    注:使用 @ExceptionHandler 注解在 @Controller 类中定义的异常处理方法,只能作用于该类,无法处理全局异常。

    1. // 这个注解表示当前类是一个异常映射类
    2. @ControllerAdvice
    3. public class MyException {
    4. // 在@ExceptionHandler注解中指定异常类型
    5. @ExceptionHandler(value = {RuntimeException.class, ArithmeticException.class})
    6. public ModelAndView exceptionMapping(Exception exception) {// 方法形参位置接收SpringMVC捕获到的异常对象
    7. // 可以将异常对象存入模型;将展示异常信息的视图设置为逻辑视图名称
    8. ModelAndView modelAndView = new ModelAndView();
    9. modelAndView.addObject("exception", exception);
    10. modelAndView.setViewName("show-message");
    11. // 打印一下信息
    12. System.out.println(exception.getMessage());
    13. return modelAndView;
    14. }
    15. }

  • 相关阅读:
    Apache网页优化
    内存文件初始化
    嵌入式学习笔记(40)看门狗定时器
    基于Matlab分析的电力系统可视化研究
    LayaBox---TypeScript---三斜线指令
    分位数回归的求解
    java计算机毕业设计springboot+vue度假山庄酒店管理系统(源码+系统+mysql数据库+Lw文档)
    oracle之执行计划
    ZZNUOJ_C语言1081:n个数求和 (多实例测试)(完整代码)
    1000 - 熟悉一下Online Judge的环境
  • 原文地址:https://blog.csdn.net/zjs246813/article/details/136332397