一、异常处理思路:

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

二、自定义异常类 继承Exception

 package com.cy.exception;

 /**
* 系统 自定义异常类,针对预期的异常,需要在程序中抛出此类的异常
* @author chengyu
*
*/
public class CustomException extends Exception{ public String message; public CustomException(String message){
super(message);
this.message = message;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}

CustomException

三、全局异常处理器:

思路:

系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。

全局异常处理器处理思路:

解析出异常类型

如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示

如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)

 package com.cy.exception;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView; /**
* 全局异常处理器
* @author chengyu
*
*/
public class CustomExceptionResolver implements HandlerExceptionResolver{ /**
* ex 系统 抛出的异常
* handler就是处理器适配器要执行Handler对象(只有method)
*/
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) { CustomException customException = null; //解析出异常类型
//如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示
//如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)
if(ex instanceof CustomException){
customException = (CustomException) ex;
}else{
customException = new CustomException("未知错误!");
} ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", customException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
} }

四、错误页面:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误提示</title>
</head>
<body>
${message }
</body>
</html>

在springmvc.xml中配置全局异常处理器:

 <!-- 全局异常处理器 只要实现HandlerExceptionResolver接口就是全局异常处理器 -->
<bean class="com.cy.exception.CustomExceptionResolver" />

五、测试代码:

在controller、service、dao中任意一处手动抛出异常;手动抛出的异常,在错误页面显示自定义的错误异常信息;

如果不是手动抛出的异常,说明是一个RunTimeException;在错误页面只显示“未知错误”;

1)在Controller中抛出异常:

 @RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
public String editItems(Model model,@RequestParam(value="id",required=true,defaultValue="4") Integer items_id) throws Exception{
ItemsCustom itemsCustom = itemsService.findItemsById(items_id); if(itemsCustom == null){
throw new CustomException("商品信息不存在!");
} model.addAttribute("items", itemsCustom); return "items/editItems";
}

2)在service中抛出异常:

 @Override
public ItemsCustom findItemsById(Integer id) throws Exception {
Items items = itemsMapper.selectByPrimaryKey(id); if(items == null){
throw new CustomException("该商品信息不存在啊!");
} ItemsCustom itemsCoustom = null;
if(items!=null){
itemsCoustom = new ItemsCustom();
BeanUtils.copyProperties(items, itemsCoustom);
} return itemsCoustom;
}

程序运行到抛出异常会跳出该方法的,不再执行;

如果与业务功能相关的异常,建议在service中抛出异常。

与业务功能没有关系的异常,建议在controller中抛出。

上边的功能,建议在service中抛出异常。

springMVC学习(9)-全局异常处理的更多相关文章

  1. SpringMVC的处理器全局异常处理类

    SpringMVC的处理器全局异常处理类 package com.huawei.utils; import org.springframework.web.servlet.HandlerExcepti ...

  2. springBoot注解大全JPA注解springMVC相关注解全局异常处理

    https://www.cnblogs.com/tanwei81/p/6814022.html 一.注解(annotations)列表 @SpringBootApplication:包含了@Compo ...

  3. SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver

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

  4. SpringMVC 全局异常处理

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

  5. springMvc全局异常处理

    本文中只测试了:实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提 ...

  6. springmvc学习笔记--REST API的异常处理

    前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...

  7. SpringMVC的全局异常处理

    @ControllerAdvice的使用 我们都知道做项目一般都会有全局异常统一处理的类,那么这个类在Spring中可以用@ControllerAdvice来实现. @ControllerAdvice ...

  8. springmvc、 springboot 项目全局异常处理

    异常在项目中那是不可避免的,通常情况下,我们需要对全局异常进行处理,下面介绍两种比较常用的情况. 准备工作: 在捕获到异常的时候,我们通常需要返回给前端错误码,错误信息等,所以我们需要手动封装一个js ...

  9. springboot中 简单的SpringMvc全局异常处理

    1.全局异常处理类:GlobalExceptionHandler.java package com.lf.exception; import java.util.HashMap; import jav ...

随机推荐

  1. docker小demo

    http://www.blogjava.net/yongboy/archive/2013/12/12/407498.html

  2. iOS ipv6 被拒

    1.检查你所用到的库,像af 3.0以上什么的(不用改),其他的库自己去搜下是否支持ipv6吧. 2.确保你用的sdk支持ipv6,这个自己去看文档就行. 3.终端  dig +nocmd + nos ...

  3. Java语言的概述

  4. 萤石A1互联网报警盒子破解细节分析

    攻击点分析:  萤石A1互联网报警盒子使用“全无线解决方案”,传感器的报警通过433.92MHz射频信号发送给报警主机,报警主机可以通过Wi-Fi联网,将报警上传萤石云端,云端会将信息推送到手机端的“ ...

  5. Windows 7 64bit Python 2 Install

    安装 setuptools 出现 UnicodeDecodeError 文件 Lib/mimetypes.py 中的 bug, 通过以下 patch 修复: Index: Lib/mimetypes. ...

  6. 第八章 Redis数据库结构与读写原理

    注:本文主要参考自<Redis设计与实现> 1.数据库结构 每一个redis服务器内部的数据结构都是一个redisDb[],该数组的大小可以在redis.conf中配置("dat ...

  7. BZOJ3551: [ONTAK2010]Peaks加强版【Kruskal重构树】【主席树】

    重要的事情说三遍 不保证图联通 不保证图联通 不保证图联通 那些和我一样认为重构树是点数的童鞋是要GG Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个 ...

  8. 51Nod:1134 最长递增子序列

    动态规划 修改隐藏话题 1134 最长递增子序列  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递 ...

  9. 蓝桥杯 BASIC-3:字母图形

      基础练习 字母图形   时间限制:1.0s   内存限制:256.0MB        问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCD ...

  10. Eclipse+Spring学习(一)环境搭建(转)

    最近由于投了一家公司实习,他要java工程师,而我大学3年的精力都花到了ASP.NET和前端上面,到找工作的时候才发现大公司不要.NET的,所以马上转型java...由于网上的高手都不屑于写这类文章, ...