1. 第一步先写个Hello World

1.1 编写一个抛出异常的目标方法

 @RequestMapping("/testException.do")
public String testException(){
int i = 1 / 0 ;
return "index" ;
}

1.2 当前Controller中添加@ExceptionHandler标记方法

@ExceptionHandler(value = {ArithmeticException.class})
public ModelAndView handleArithException(Exception ex){
ModelAndView mv = new ModelAndView("error") ;
mv.addObject("ex",ex) ;
return mv ;
}

 1.3 加上error界面

1.4 测试结果

1.5 总结一下

1)@ExceptionHandler标记的方法在目标方法发生对应的异常触发,传入的参数Exception即为对应的异常对象

2)不能通过参数中添加Map的形式将异常对象传递的界面,需要用ModelAndView的形式实现

3)优先级:优先在当前Controller中@ExceptionHandler标记的方法,如果有多个,谁标记的异常越接近,则选择谁,如果当前Controller没有匹配到,则在@ControllerAdvice标记的类中找@ExceptionHandler标记的方法

2. @ResponseStatus注解能够实现目标异常产生时,反馈给client端指定的状态码跟信息

2.1 构建目标异常并添加@ResponseStatus注解

@ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "test")
public class TestException extends RuntimeException {
}

2.2 构建测试RequestMapper

 @RequestMapping("/testResponseStatus.do")
public String testResponseStatus(){
throw new TestException() ;
}

2.3 测试结果如下

2.4 如果指定异常被ExceptionHandler捕获时,发生什么?

1)在上述ExceptionHandler中添加TextException

2)重新部署测试结果

3. 可通过spring-mvc.xml配置ExceptionResolver实现指定异常发送跳转到指定页面

3.1 定义指定异常

public class TestDefaultException extends RuntimeException {
}

3.2 spring-mvc.xml中进行配置

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error"></property>
<property name="exceptionAttribute" value="ex"/>
<property name="exceptionMappings">
<props>
<prop key="com.pawn.crud.exceptions.TestDefaultException">error</prop>
</props>
</property>
</bean>

3.3 测试

@RequestMapping("/testDefaultException.do")
public String testDefaultException(){
throw new TestDefaultException() ;
}

3.4 有个小坑:指定的异常不能加@ResponseStatus注解,否则配置的ExceptionResolver会失效

demo:https://github.com/705645051/demoCrud

每天学点SpringMVC-异常处理的更多相关文章

  1. SpringMVC异常处理机制详解[附带源码分析]

    目录 前言 重要接口和类介绍 HandlerExceptionResolver接口 AbstractHandlerExceptionResolver抽象类 AbstractHandlerMethodE ...

  2. SpringMVC异常处理机制

    SpringMVC异常处理机制 springMVC会将所有在doDispatch方法中的异常捕获,然后处理.无法处理的异常会抛出给容器处理. 在doDispatch()中调用processDispat ...

  3. 【SpringMVC】SpringMVC 异常处理

    SpringMVC 异常处理 文章源码 异常处理思路 系统中异常包括两类:预期异常和运行时异常,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. Cont ...

  4. SpringMvc异常处理

    SpringMvc通过HandlerExceptionResolver处理程序的异常,包括Handler映射.数据绑定.以及方法执行时发生的异常,SpringMvc提供的HandlerExceptio ...

  5. SpringMVC 异常处理

    SpringMVC学习系列(10) 之 异常处理 在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的.那么如何保证我们处理异常的代码 ...

  6. SpringMVC异常处理方式

    一.描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合 ...

  7. SpringMVC——异常处理

    Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射.数据绑定以及目标方法执行时发生的异常. SpringMVC 提供的 Handl ...

  8. springmvc异常处理(非注解与注解)

    1.异常 程序中的异常一般分为两类:预期异常,运行时异常.前者是我们可预知的,我们一般通过捕获和抛出方式处理这些异常.后者主要通过代码规范.测试等手段来减少异常的发生.一般,我们在系统的DAO.Ser ...

  9. (十一)springMvc 异常处理

    文章目录 思路 自定义异常处理类 全局异常处理器 配置全局异常处理器 思路 在 springMvc 中,异常一层一层的往上抛,最后抛给 前端控制器,前端控制器内部会去找 全局异常处理器(一个系统只会有 ...

  10. springMVC异常处理(自定义异常)HandlerExceptionResolver

    注:本篇的异常主要指的是controller.service和dao层中执行方法抛出的异常. 一.为什么要处理异常? 因为如果我们不处理异常,异常信息就会直接抛出给浏览器,于是浏览器页面就直接显示异常 ...

随机推荐

  1. Firefox插件推荐

    介绍一下我常用的几个Firefox插件,不一定适合所有人. 图中所示4个插件是我仅有的4个addons,除了stylish,其他几个已经伴随我多年. 1.Adblock Plus(强烈推荐) 广告拦截 ...

  2. 转每天一个linux命令(14):head 命令

    head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...

  3. Java入门(3)—— 数组

    数组 概述:数组就是一个容器可以存放固定个数的单一数据类型 特点: 容器 长度是固定的 数组里面的元素的数据类型要一致 定义数组: 1.先声明,后初始化 声明: 数据类型[] 数组名; // 标识符命 ...

  4. 扩展Python模块系列(四)----引用计数问题的处理

    承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...

  5. win10的power shell可以学习少部分linux命令_功能与cmd类似

    更新帮助文件:

  6. 【Linux】ssh免密登录

    一.ssh免密配置 ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例.有机器A(192.168.1.155),B(192.168. ...

  7. Redis[三] @Hash 哈希

    Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型 在Redis中的哈希值,可存储超过400十亿键值对. redis 提供了2套操纵 一种是批量 一种是非批量 假设需 ...

  8. Statement和PrepareStatement区别

    网上很多都说区别是PrepareStatement可以批处理.实际上二者都是可以进行批处理的. 区别在于: 1.PrepareStatement要求预编译的sql必须是格式固定,使用占位符获取参数. ...

  9. Wireshark使用drcom_2011.lua插件协助分析drcom协议

    drcom_2011.lua是来源于Google code上的一个开源项目中的一个插件,感谢网络大神的分享 需要使用drcom_2011.lua分析drcom协议的话,需要把drcom_2011.lu ...

  10. css中使用变量

    2017年3月,微软宣布 Edge 浏览器将支持 CSS 变量.这个重要的 CSS 新功能,所有主要浏览器已经都支持了. 声明css变量的时候,变量名前面要加两根连词线(--).变量名大小写敏感,-- ...