springMVC学习(9)-全局异常处理
一、异常处理思路:
系统中异常包括两类:预期异常和运行时异常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)-全局异常处理的更多相关文章
- SpringMVC的处理器全局异常处理类
SpringMVC的处理器全局异常处理类 package com.huawei.utils; import org.springframework.web.servlet.HandlerExcepti ...
- springBoot注解大全JPA注解springMVC相关注解全局异常处理
https://www.cnblogs.com/tanwei81/p/6814022.html 一.注解(annotations)列表 @SpringBootApplication:包含了@Compo ...
- SpringMVC 学习笔记(十) 异常处理HandlerExceptionResolver
Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包含 Handler 映射.数据绑定以及目标方法运行时发生的异常. SpringMVC 提供的 Handl ...
- SpringMVC 全局异常处理
在 JavaEE 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度 ...
- springMvc全局异常处理
本文中只测试了:实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提 ...
- springmvc学习笔记--REST API的异常处理
前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...
- SpringMVC的全局异常处理
@ControllerAdvice的使用 我们都知道做项目一般都会有全局异常统一处理的类,那么这个类在Spring中可以用@ControllerAdvice来实现. @ControllerAdvice ...
- springmvc、 springboot 项目全局异常处理
异常在项目中那是不可避免的,通常情况下,我们需要对全局异常进行处理,下面介绍两种比较常用的情况. 准备工作: 在捕获到异常的时候,我们通常需要返回给前端错误码,错误信息等,所以我们需要手动封装一个js ...
- springboot中 简单的SpringMvc全局异常处理
1.全局异常处理类:GlobalExceptionHandler.java package com.lf.exception; import java.util.HashMap; import jav ...
随机推荐
- Fedora 安装与常用命令
fedora下载地址: https://getfedora.org/ 原来装的26,现在装27 用的是server版网络安装500多M 现在都是U盘安装了,fedora的写优盘说明 https://f ...
- sublime text3的快捷键
Ctrl + Shift + P 调出命令板(Command Palette) Ctrl + ` 调出控制台 Ctrl + D 选择当前光标所在的词并高亮该词所有出现的位置,再次 C ...
- tf.nn的conv2d卷积与max_pool池化
tf.nn.conv2d(value,filter,strides,[...]) 对于图片来说 value : 形状通常是np.array()类型的4维数组也称tensor(张量), (batc ...
- 【设计模式】 模式PK:工厂模式VS建造者模式
1.概述 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象.我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方 ...
- Windows系统80端口被占用
1.查看系统端口被占用情况, 执行命令netstat -ano ,可以查看到被占用的端口对于的PID. 2. 打开任务管理器,然后点击“查看”→“选择PID”,勾上PID,再按PID排序,即可以看到8 ...
- win10下tomcat环境搭建
一.下载tomcat 用浏览器打开tomcat官网:http://tomcat.apache.org/ 在左侧的导航栏Download下方选择最新的Tomcat 9,点击页面下方的“ 64-bit W ...
- 【转】游戏buff设计参见
其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...
- mac 常用开发软件列表
toolbox app jetbrains系开发工具箱,包含了phpstorm idea等开发工具 Postman 接口调试工具,有插件版和单独的app两种.类似paw Sublime 文本编辑器,类 ...
- 初次实践数据库--SQL Server2016
初学数据库使用 安装了SQL Server2016的开发者版本,本来以为就可以愉快地开始数据库的挖坑了,发现开出来之后除了创建数据库.选择数据库以外,并没有什么操作. 后来才发现还需要再安装SSMS( ...
- hdu2084 数塔 DP
数字三角形,DP裸题 #include<stdio.h> #include<string.h> #define max(a,b) (a)>(b)?a:b ][],dp[] ...