12【SpringMVC的异常处理】

news/2025/1/11 9:53:44/

文章目录

  • 六、SpringMVC的异常处理
    • 6.1 SpringMVC异常概述
    • 6.2 SpringMVC异常处理
      • 6.2.1 单个类处理方式
      • 6.2.2 处理全局异常
      • 6.2.3 注解方式实现全局异常


六、SpringMVC的异常处理

6.1 SpringMVC异常概述

我们在处理异常时,通常使用try…catch块来处理程序中发生的异常;出现异常时每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。

SpringMVC提供的异常处理机制可以把异常处理抽离成方法、类;让处理异常的代码与我们的业务代码完全分开,降低与业务核心代码的耦合度;

6.2 SpringMVC异常处理

6.2.1 单个类处理方式

  • Controller:
package com.dfbz.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author lscl* @version 1.0* @intro:*/
@Controller
@RequestMapping("/demo01")
public class Demo01Controller {@RequestMapping("/demo01")@ResponseBodypublic String demo01(Integer flag) {if (flag == 0) {// 模拟异常int i = 1 / 0;}return "success";}/*** 如果出现了ArithmeticException就进入此方法** @param model: BingMap对象* @param e: 触发的异常对象* @return*/@ExceptionHandler(value = {ArithmeticException.class})public String arithmeticExceptionHandler(Model model, Exception e) {model.addAttribute("message",e.getMessage());return "forward:/error.jsp";}/*** 出现异常就进入此方法(如果能匹配具体子类则进入子类异常)* @param model* @param e* @return*/@ExceptionHandler(value = {Exception.class})public String exceptionHandler(Model model, Exception e) {model.addAttribute("message", e.getMessage());return "forward:/error.jsp";}
}

6.2.2 处理全局异常

我们可以编写一个类实现实现HandlerExceptionResolver接口来处理全局异常

package com.dfbz.exception;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.view.RedirectView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;/*** @author lscl* @version 1.0* @intro: 自定义异常处理类*/
@Component
public class MyExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println(handler.getClass());System.out.println(ex.getClass());ModelAndView mv = new ModelAndView();mv.addObject("message", ex.getMessage());mv.setViewName("/error.jsp");return mv;}
}

Tips:如果异常被Controller中的某个ExceptionHandler方法匹配了,那么不会进入自定义的异常解析器;

6.2.3 注解方式实现全局异常

  • @ControllerAdvice:注解可以配置全局异常

  • @ExceptionHandler(Exception.class):设置什么异常才会进入方法

package com.dfbz.exception;import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;/*** @author lscl* @version 1.0* @intro: 使用注解方式配置全局异常*/
@ControllerAdvice           
public class AnnoMyExceptionHandler {/***  出现ArithmeticException时进入此方法* @param model* @param e* @return*/@ExceptionHandler(value = ArithmeticException.class)     public String arithmeticExceptionHandler(Model model, Exception e) {model.addAttribute("message", e.getMessage());return "forward:/error.jsp";}/*** 出现Exception时进入此方法* @param e* @return*/@ExceptionHandler(Exception.class)public String exceptionHandler(Model model, Exception e) {model.addAttribute("message", e.getMessage());return "forward:/error.jsp";}
}

Tips:

  • 1)当同时定义了异常解析器(HandlerExceptionResolver)和@ControllerAdvice时,@ControllerAdvice优先级高;
  • 2)如果@ControllerAdvice标注的异常和Controller方法定义的异常冲突,则以Controller中标注有@ExceptionHandler的方法优先;


http://www.ppmy.cn/news/6227.html

相关文章

Hadoop综合项目——二手房统计分析(MapReduce篇)

Hadoop综合项目——二手房统计分析(MapReduce篇) 文章目录Hadoop综合项目——二手房统计分析(MapReduce篇)0、 写在前面1、MapReduce统计分析1.1 统计四大一线城市房价的最值1.2 按照城市分区统计二手房数量1.3 根据二手房信息发布…

直播弹幕系统(六)- SpringBoot + STOMP + RabbitMQ(使用MQ替代Spring代理)

直播弹幕系统(六)- SpringBoot STOMP RabbitMQ(使用MQ替代Spring代理)前言一. SpringBoot整合RabbitMQ代理Broker1.1 RabbitMQ安装STOMP插件(Docker)1.2 RabbitMQ相关准备1.3 其他代码二. 前端整合Rabbit…

STM32三条总线(AHB、APB1、APB2)的外设映射情况

STM32三条总线(AHB、APB1、APB2)的外设映射情况 1、AHB (1)Flash储存器 (2)DMA (3)复位和时钟控制 (4)CRC (5)以太网 (6)SDIO 2、APB1总线(支持低速状态下的工作) (1)定时器TIM2到TIM7 (2)RTC (3)WDT看门狗 (4)SPI2、SPI3 (5)USART2、USART3 (6)UART4、U…

JavaSE基础篇:枚举

文章部分内容整理自知乎Peter McLeish的回答第一章:枚举类一:自定义一个枚举类二:JDK提供的枚举类型三:枚举中静态代码块的执行顺序第一章:枚举类 枚举类:类的对象只有有限个,且是确定的 Java…

DaVinci:曲线之 HSL 曲线

调色页面:曲线Color:CurvesH 指的是色相 Hue,S 指的是饱和度 Saturation,L 指的是亮度 Luminance。DaVinci Resolve 的曲线调板中,除了自定义曲线,还提供了六种基于色相、饱和度或亮度的调节曲线&#xff0…

图(Graph)的定义

图(Graph)的定义 文章目录图(Graph)的定义●图的形式化定义:G (V,E)●无向图和有向图的表示形式:● 有向图和无向图的定义●抽象数据类型定义ADT●图形结构属于复杂的非线性结构● 图由顶点的集合和边的集合构成 ●图的形式化定义:G (V,E) • 集合V(vertex):顶点的有限集合,…

【网络安全】浅识 SQL 注入

前言 SQL 注入(SQL Injection)是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞。主要原因是程序对用户输入数据的合法性没有判断和处理,导致攻击者可以在 Web 应用程序中事先定义好的 SQL 语句中添加额外…

我写这10+个JavaScript单行代码,被组长夸代码写得优雅!

大厂面试题分享 面试题库 前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 JavaScript 非常大的特点容易上手且非常灵活,代码实现方式五花八门;有时候能一行代码解决,就尽量不用…