博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Spring学习笔记-MVC-15】Spring MVC之异常处理
阅读量:4316 次
发布时间:2019-06-06

本文共 2291 字,大约阅读时间需要 7 分钟。

作者:ssslinppp      

1. 描述

在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。
那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的。下面将介绍使用Spring MVC统一处理异常的解决和实现过程。

2. 异常处理方式

Spring MVC处理异常有3种方式:
(1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
(2)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
(3)使用@ExceptionHandler注解实现异常处理; 

3. 模拟异常抛出

项目结构:


Dao层:


Service层:


Controller层:


JSP界面

4.HandlerExceptionResolver方式

第1步:定义异常类MyException.java

 
  1. package com.ll.Exception;
  2. import java.io.IOException;
  3. import java.sql.SQLException;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.springframework.web.servlet.HandlerExceptionResolver;
  9. import org.springframework.web.servlet.ModelAndView;
  10. public class BaseController implements HandlerExceptionResolver {
  11. @Override
  12. public ModelAndView resolveException(HttpServletRequest request,
  13. HttpServletResponse response, Object handler, Exception ex) {
  14. // 添加自己的异常处理逻辑,如日志记录等
  15. Map<String, Object> model = new HashMap<String, Object>();
  16. model.put("ex", ex);
  17. // 根据不同错误转向不同页面
  18. if (ex instanceof SQLException) {
  19. return new ModelAndView("error", model);
  20. } else if (ex instanceof IOException) {
  21. return new ModelAndView("error", model);
  22. } else {
  23. return new ModelAndView("error", model);
  24. }
  25. }
  26. }

第2步:在applicationContext.xml配置

 
  1. <bean id="exceptionHandler" class="com.ll.Exception.BaseController"/>

测试:



特点


使用实现HandlerExceptionResolver接口的异常处理器进行异常处理,具有集成简单、有良好的扩展性、
对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。
5. @ExceptionHandler注解实现异常处理

第1步:定义异常处理基类



第2步:是controller层继承该基类




测试



特点


使用@ExceptionHandler注解实现异常处理,具有集成简单、有扩展性好(只需要将要异常处理的Controller类继承于BaseController即可)、不需要附加Spring配置等优点,
但该方法对已有代码存在入侵性(需要修改已有代码,使相关类继承于BaseController),在异常处理时不能获取除异常以外的数据。 

6. 优先级

既然在SpringMVC中有两种处理异常的方式,那么就存在一个优先级的问题:
当发生异常的时候,SpringMVC会如下处理:
(1)SpringMVC会先从配置文件找异常解析器
HandlerExceptionResolver(优先级较高)
(2)如果找到了异常解析器,那么接下来就会判断该异常解析器能否处理当前发生的异常
(3)如果可以处理的话,那么就进行处理,然后给前台返回对应的异常视图
(4)如果没有找到对应的异常解析器或者是找到的异常解析器
不能处理当前的异常的时候,就看当前的Controller中有没有提供对应的异常处理器,如果提供了就由Controller自己进行处理并返回对应的视图
(5)如果配置文件里面没有定义对应的异常解析器,而当前Controller中也没有定义的话,那么该异常就会被抛出来。

参考链接:
 
 
博客:
 
 

附件列表

 

转载于:https://www.cnblogs.com/ssslinppp/p/4610043.html

你可能感兴趣的文章
Java中关键词之this,super的使用
查看>>
学习进度
查看>>
“此人不存在”
查看>>
github.com加速节点
查看>>
解密zend-PHP凤凰源码程序
查看>>
python3 序列分片记录
查看>>
Atitit.git的存储结构and 追踪
查看>>
atitit 读书与获取知识资料的attilax的总结.docx
查看>>
B站 React教程笔记day2(3)React-Redux
查看>>
找了一个api管理工具
查看>>
Part 2 - Fundamentals(4-10)
查看>>
使用Postmark测试后端存储性能
查看>>
NSTextView 文字链接的定制化
查看>>
第五天站立会议内容
查看>>
CentOs7安装rabbitmq
查看>>
(转))iOS App上架AppStore 会遇到的坑
查看>>
解决vmware与主机无法连通的问题
查看>>
做好产品
查看>>
项目管理经验
查看>>
笔记:Hadoop权威指南 第8章 MapReduce 的特性
查看>>