SpringMVC(12):异常处理(局部异常和全局异常)

18/1/15

    SpringMVC 通过 HandlerExceptionResolver 处理程序异常,包括:处理器异常、数据绑定异常、处理器执行发生的异常。HandlerExceptionResolver 仅仅只有一个接口方法。当发送异常时,SpringMVC 调用 resolveException () 方法,并转到ModelAndView 对应的视图中,作为一个异常报告页面反馈给用户。对于异常,一般分为局部和全局。

一、局部异常处理

【1】修改UserController.java,添加以下方法:

	//局部异常
	@RequestMapping(value="exlogin",method=RequestMethod.GET)
	public String exlogin(@RequestParam String userName,@RequestParam String userPassword) throws SQLException{
		User user = userService.login(userName, userPassword);
		if(null == user){
			throw new RuntimeException("用户名或者密码不正确!");
		}
		return "redirect:frame";
	}
	
	//局部异常
	@ExceptionHandler(value={RuntimeException.class})
	public String handlerException(RuntimeException e, HttpServletRequest req){
		req.setAttribute("e", e);
		return "error";
	}


exlogin方法处理用户登录请求,若登录失败,则抛出一个RuntimeException ,它会被处于同一个处理器类中的handlerException 方法捕获。@ExceptionHandler 可以指定多个异常,这里示例指定一个。handlerException 方法:把异常提示信息放入HttpServletRequest 对象中,并返回逻辑视图名error。

 

【2】在login.jsp 添加${e.message};

 

二、全局异常处理

【1】注释掉局部异常,然后在springmvc-servlet.xml 配置文件配置全局异常:

 

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


全局异常用 SimpleMapperExceptionResolver 来实现,它将异常类名映射为视图名,即发生异常时,会使用对应的视图报告异常。

 

【2】在login.jsp 添加${exception.message};

 

【3】运行结果:

 


欢迎扫二维码关注公众号,获取技术干货

 

<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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值