SpringMVC全局和局部的异常处理

本文探讨了SpringMVC框架中如何进行局部和全局的异常处理。局部异常处理涉及捕获并处理特定异常,而全局异常处理则是在SpringMVC配置文件中配置,用于统一处理所有未被局部处理的异常,提供更全面的错误反馈。

局部异常处理的方法:

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/demo")
public class DemoController {
    /**
     * 局部异常处理
     * 只能处理当前控制器出现的异常
     * @return
     */
    @ExceptionHandler(value = {Exception.class})
    public String HandlerException(){
        System.out.println("DemoController出现异常");
        return "errorPage";
    }

    @RequestMapping("/test1")
    public String test1(){
        System.out.println("test1方法。。。");
        return "page";
    }
}

打印异常信息:

 /**
     * 展示异常
     * @param exception 异常信息
     * @return
     */
    @ExceptionHandler(value = {Exception.class})
    public String HandlerException1(Exception exception){
        System.out.println("DemoController出现异常" + exception);
        return "errorPage";
    }

全局异常处理方法:

<!--全局异常处理-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.RuntimeException">error</prop>
            </props>
        </property>
    </bean>

在SpringMVC配置文件 spring-mvc.xml中配置全局异常处理

<think>首先,用户的问题是:“我想查找SpringMVC处理异常的方法 请问SpringMVC处理异常的方法”。用户明确表示想了解SpringMVC处理异常的方法。 用户提供了站内引用[1],内容是关于SpringMVC三种异常处理方式的概述: - 一、使用SimpleMappingExceptionResolver - 二、实现HandlerExceptionResolver接口自定义异常处理器 - 三、使用@ExceptionHandler实现异常处理 用户提示说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题你的回答。” 但是,在这个对话中,没有之前的上下文;这是我的第一条响应。用户说“参考用户上一次的问题你的回答”,但在这个系统里,这是第一条消息。所以,我应该基于当前信息。 用户消息结尾是:“我想查找SpringMVC处理异常的方法 请问SpringMVC处理异常的方法”,所以我需要直接回答这个问题。 系统级指令: - 所有行内数学表达式必须使用$...$格式(但这里主题是SpringMVC异常处理,可能没有数学表达式)。 - 独立公式使用$$...$$(同样,可能不适用)。 - LaTeX语法正确(同样)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。用户提供了引用[1],所以我应该在回答中引用它。 用户提供的引用[1]是关于异常处理方法的,所以我会基于这个来回答。 回答结构: - 我应该结构清晰,帮助用户逐步解决问题。 - 基于引用[1],SpringMVC异常处理有三种方式: 1. 使用SimpleMappingExceptionResolver(全局) 2. 实现HandlerExceptionResolver接口自定义异常处理器(全局) 3. 使用@ExceptionHandler实现异常处理局部) 在回答中,我需要自然地添加引用标识。用户引用是[^1],所以我应该在相关部分添加[^1]。 最后,生成相关问题,就像示例一样,以“§§相关问题§§”开头。 组织回答: 1. 介绍SpringMVC异常处理。 2. 分点描述三种方法: - 第一种:SimpleMappingExceptionResolver - 第二种:实现HandlerExceptionResolver - 第三种:@ExceptionHandler 每个描述时,参考引用[1]。 3. 添加引用标识。 4. 结尾生成相关问题。 使用中文回答。 相关问题:基于主题,生成关于SpringMVC异常处理的深入问题,比如: - 如何配置具体的异常处理器? - 全局局部异常处理区别? - 在实际项目中如何选择? 类似示例中的问题格式。 最终输出: - 回答部分 - §§相关问题§§ - 相关问题列表 </think>SpringMVC 提供了三种异常处理机制来帮助开发者优雅地处理运行时错误,确保应用健壮性用户体验。这些方法基于 Spring 框架的灵活性,可根据需求选择全局局部处理策略[^1]。以下是每种方式的详细说明: ### 1. **使用 SimpleMappingExceptionResolver(全局异常处理器)** SimpleMappingExceptionResolver 是 SpringMVC 内置的简易异常处理器,用于全局捕获异常并映射到自定义错误页面。配置简单,适合快速集成: - **配置方式**:在 Spring 配置文件(如 `spring-servlet.xml`)中添加 bean 定义。例如,将所有 `Exception` 映射到 `error` 视图: ```xml <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">error</prop> <!-- 异常类型映射到视图名 --> </props> </property> </bean> ``` - **优点**:无需编码,支持批量异常映射。 - **缺点**:灵活性较低,无法自定义异常处理逻辑[^1]。 ### 2. **实现 HandlerExceptionResolver 接口(自定义全局异常处理器)** 通过实现 `HandlerExceptionResolver` 接口,开发者可自定义全局异常处理逻辑,适用于复杂业务场景: - **实现步骤**: - 创建类实现 `HandlerExceptionResolver` 接口,重写 `resolveException` 方法。 - 在方法内编写异常处理代码(如日志记录、返回 JSON 错误响应)。 - 注册为 Spring bean。 ```java public class CustomExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 自定义逻辑,例如返回错误视图 ModelAndView mav = new ModelAndView("error"); mav.addObject("message", ex.getMessage()); return mav; } } ``` - **优点**:高度灵活,可处理所有控制器抛出的异常。 - **注意事项**:需手动管理异常映射,适用于大型项目[^1]。 ### 3. **使用 @ExceptionHandler 注解(局部异常处理器)** `@ExceptionHandler` 注解作用于控制器(Controller)方法上,用于捕获特定类中的异常: - **实现方式**:在控制器类内定义方法,添加 `@ExceptionHandler` 并指定处理的异常类型。 ```java @Controller public class UserController { @ExceptionHandler(RuntimeException.class) public ModelAndView handleRuntimeException(RuntimeException ex) { ModelAndView mav = new ModelAndView("runtime-error"); mav.addObject("error", ex); return mav; } } ``` - **优点**:简洁易用,针对性强,适合特定业务逻辑的异常。 - **缺点**:仅限于当前控制器,无法全局捕获[^1]。 ### 总结与最佳实践 - **全局 vs 局部**:前两种方法(SimpleMappingExceptionResolver HandlerExceptionResolver)是全局处理器,适用于系统级异常;@ExceptionHandler 是局部处理器,适合控制器级错误。 - **推荐场景**:小型项目用 SimpleMappingExceptionResolver,大型项目结合 HandlerExceptionResolver @ExceptionHandler 实现多层次处理[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值