1.异常

程序中的异常一般分为两类:预期异常,运行时异常。前者是我们可预知的,我们一般通过捕获和抛出方式处理这些异常。后者主要通过代码规范、测试等手段来减少异常的发生。一般,我们在系统的DAO、Service层的异常都向上抛出,然后统一的在Controller中进行处理。但是每个Controller中的每个方法都写类似的异常处理逻辑,就显得非常的麻烦,并且代码重复。

Spring提供了异常处理器(HandlerExceptionResolver)来处理异常。我们定义好处理异常的逻辑,SpringMVC会在任何的Controller出现异常时,调用我们定义的异常处理逻辑。从而实现异常的统一管理,并且避免了代码的重复。

其异常处理流程如下:

2.非注解使用异常案例.

异常分为自定义异常和运行时异常,这就要分别编写自定义异常和运行时异常。

2.1编写一个controller类,给类方法中出现两个异常,分别是自定义和运行时异常,代码如下:

  1. @RequestMapping("ex/")
  2. @Controller
  3. public class ExceptionController {
  4.  
  5. @RequestMapping("show/{id}")
  6. @ResponseStatus(HttpStatus.OK)
  7. public ModelAndView show(@PathVariable("id") Long id) throws MyException{
  8.  
  9. ModelAndView mv = new ModelAndView("hello");
  10. // 自定义异常
  11. if(id==){
  12. throw new MyException("自定义异常出现");
  13. }
  14. System.out.println("exception");
  15.  
  16. // 运行时异常
  17. System.out.println(/);
  18.  
  19. mv.addObject("msg", "传递参数"+id);
  20.  
  21. return mv;
  22. }

2.2如果出现自定义异常,需要处理,需要编写自定义异常类,且继承Exception,代码如下:

  1. package cn.exception;
  2.  
  3. public class MyException extends Exception {
  4.  
  5. /**
  6. * 自定义异常
  7. */
  8. private static final long serialVersionUID = 1L;
  9.  
  10. // 提供构造函数
  11. public MyException() {
  12. super();
  13. }
  14.  
  15. public MyException(String message) {
  16. super(message);
  17. }
  18. }

2.3.需要定义异常处理器(编写类实现HandlerExceptionResolver )

  1. package cn.exception;
  2.  
  3. import java.io.PrintWriter;
  4. import java.io.StringWriter;
  5.  
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8.  
  9. import org.springframework.web.servlet.HandlerExceptionResolver;
  10. import org.springframework.web.servlet.ModelAndView;
  11.  
  12. public class MyexceptionResolver implements HandlerExceptionResolver {
  13.  
  14. //异常处理的方法
  15. @Override
  16. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
  17. Exception ex) {
  18. ModelAndView mv = new ModelAndView("error");
  19. String msg = null;
  20. // 判断是否是自定义异常
  21. if(ex instanceof MyException){
  22. msg = ex.getMessage();
  23. }else{
  24. // 如果不是,则获取栈信息
  25. StringWriter out = new StringWriter();
  26. PrintWriter pw = new PrintWriter(out);
  27. ex.printStackTrace(pw);
  28. msg = out.toString();
  29. }
  30. // 添加异常信息到Model
  31. mv.addObject("msg", msg);
  32. return mv;
  33. }
  34.  
  35. }

2.4.在Springmvc配置文件中,配置异常处理器

  1. <!-- 配置异常处理页面 -->
  2. <bean class="cn.exception.MyexceptionResolver"></bean>

2.5.编写异常页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. 异常发生了...${msg }
  11. </body>
  12. </html>

3.非注解使用异常案例.

  1. package cn.controller;
  2.  
  3. import java.io.PrintWriter;
  4. import java.io.StringWriter;
  5.  
  6. import org.springframework.web.bind.annotation.ControllerAdvice;
  7. import org.springframework.web.bind.annotation.ExceptionHandler;
  8. import org.springframework.web.servlet.ModelAndView;
  9.  
  10. import cn.exception.MyException;
  11.  
  12. @ControllerAdvice
  13. public class ExceptionControllerAdvice {
  14.  
  15. // 处理自定义异常
  16. @ExceptionHandler(MyException.class)
  17. public ModelAndView zdyException(MyException e){
  18. ModelAndView mv = new ModelAndView("error");
  19.  
  20. mv.addObject("msg", e.getMessage());
  21.  
  22. return mv;
  23. }
  24.  
  25. // 处理运行时异常
  26. @ExceptionHandler(RuntimeException.class)
  27. public ModelAndView zdyException(RuntimeException ex){
  28. ModelAndView mv = new ModelAndView("error");
  29.  
  30. mv.addObject("msg", ex.getMessage());
  31. StringWriter out = new StringWriter();
  32. PrintWriter pw = new PrintWriter(out);
  33. ex.printStackTrace(pw);
  34. mv.addObject("msg", out.toString());
  35. return mv;
  36. }
  37.  
  38. }

需要提供自定义异常类,见上面MyException

springmvc异常处理(非注解与注解)的更多相关文章

  1. SpringMVC的controller方法中注解方式传List参数使用@RequestBody

    在SpringMVC控制器方法中使用注解方式传List类型的参数时,要使用@RequestBody注解而不是@RequestParam注解: //创建文件夹 @RequestMapping(value ...

  2. springMVC学习记录2-使用注解配置

    前面说了一下使用xml配置springmvc,下面再说说注解配置.项目如下: 业务很简单,主页和输入用户名和密码进行登陆的页面. 看一下springmvc的配置文件: <?xml version ...

  3. SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo

    使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...

  4. SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系

    一般我们开发时,使用最多的还是@RequestMapping注解方式. @RequestMapping(value = "/", param = "role=guest& ...

  5. SSM框架之SpringMVC(3)常用注解

    SpringMVC(3)常用注解 1. RequestParam注解 1.作用:把请求中指定名称的参数传递给控制器中的形参赋值 2.属性: ​ 1.value:请求参数的每次 ​ 2.required ...

  6. SpringMVC利用AOP实现自定义注解记录日志

    作者:飞翔的拖鞋up 推荐:彻底征服 Spring AOP 之 实战篇 推荐:jason_zhangz 本文抛砖引玉,并没有详细的介绍更全面的内容,通过一个例子让初次使用的人能够快速入门,简单的介绍一 ...

  7. SpringMVC源码解读 - RequestMapping注解实现解读

    SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系  https://www.cnblogs.com/leftthen/p/520840 ...

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

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

  9. SpringMVC异常处理机制

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

随机推荐

  1. IOS 多线程的一些总结

    IOS 多线程 有三种主要方法 (1)NSThread (2)NSOperation (3)**   下面简单介绍这三个方法 1.NSThread 调用方法如下:         如函数需要输入参数, ...

  2. codevs1044 拦截导弹==洛谷 P1020 导弹拦截

    P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天 ...

  3. 1060 最复杂的数(反素数玄学dfs)

    1060 最复杂的数 题目来源: Ural 1748 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中 ...

  4. easy 正则表达式验证 封装

    基于EasyUI ValidateBox 的表单验证,可以直接写正则表达式. 在页面加载时执行下面代码 if ($.fn.form) { $.extend($.fn.validatebox.defau ...

  5. "大中台、小前台”新架构下,阿里大数据接下来怎么玩? (2016-01-05 11:39:50)

    "大中台.小前台”新架构下,阿里大数据接下来怎么玩?_炬鼎力_新浪博客 http://blog.sina.com.cn/s/blog_1427354e00102vzyq.html " ...

  6. jQuery方法find()与children()区别

    一.find() 1.1 说明 find()方法返回被选元素的后代元素,一路向下直到最后一个后代. 1.2 示例 <div> <p> <span>1</spa ...

  7. PowerPC架构与X86架构

    PowerPC架构 PowerPC是一种精简指令集(RISC)架构的中央处理器(CPU),其基本的设计源自IBM(国际商用机器公司)的POWER(Performance Optimized With ...

  8. TreeMap详细介绍(源码解析)和使用示例

    本文转自 http://www.cnblogs.com/skywang12345/p/3310928.html 概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学 ...

  9. NOIP2010~2017部分真题总结

    NOIP2010~2017部分真题总结 2010 (吐槽)md这个时候的联赛还只有4题吗? 引水入城 只要发现对于有合法解的地图,每个蓄水厂贡献一段区间这个结论就很好做了 那么\(O(n^3)\)对每 ...

  10. MCU与FPGA通信

    1.MCU启动FPGA相应功能模块 通过译码器选择相应的功能模块,调用实现功能. 2.MCU与FPGA串口通信 SPI协议简单.可靠.易实现,速度快,推荐使用SPI.SPI为四线机制,包含MOSI.M ...