springmvc异常处理(非注解与注解)
1.异常
程序中的异常一般分为两类:预期异常,运行时异常。前者是我们可预知的,我们一般通过捕获和抛出方式处理这些异常。后者主要通过代码规范、测试等手段来减少异常的发生。一般,我们在系统的DAO、Service层的异常都向上抛出,然后统一的在Controller中进行处理。但是每个Controller中的每个方法都写类似的异常处理逻辑,就显得非常的麻烦,并且代码重复。
Spring提供了异常处理器(HandlerExceptionResolver)来处理异常。我们定义好处理异常的逻辑,SpringMVC会在任何的Controller出现异常时,调用我们定义的异常处理逻辑。从而实现异常的统一管理,并且避免了代码的重复。
其异常处理流程如下:

2.非注解使用异常案例.
异常分为自定义异常和运行时异常,这就要分别编写自定义异常和运行时异常。
2.1编写一个controller类,给类方法中出现两个异常,分别是自定义和运行时异常,代码如下:
@RequestMapping("ex/")
@Controller
public class ExceptionController {
@RequestMapping("show/{id}")
@ResponseStatus(HttpStatus.OK)
public ModelAndView show(@PathVariable("id") Long id) throws MyException{
ModelAndView mv = new ModelAndView("hello");
// 自定义异常
if(id==){
throw new MyException("自定义异常出现");
}
System.out.println("exception");
// 运行时异常
System.out.println(/);
mv.addObject("msg", "传递参数"+id);
return mv;
}
2.2如果出现自定义异常,需要处理,需要编写自定义异常类,且继承Exception,代码如下:
package cn.exception;
public class MyException extends Exception {
/**
* 自定义异常
*/
private static final long serialVersionUID = 1L;
// 提供构造函数
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
2.3.需要定义异常处理器(编写类实现HandlerExceptionResolver )
package cn.exception; import java.io.PrintWriter;
import java.io.StringWriter; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView; public class MyexceptionResolver implements HandlerExceptionResolver { //异常处理的方法
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView mv = new ModelAndView("error");
String msg = null;
// 判断是否是自定义异常
if(ex instanceof MyException){
msg = ex.getMessage();
}else{
// 如果不是,则获取栈信息
StringWriter out = new StringWriter();
PrintWriter pw = new PrintWriter(out);
ex.printStackTrace(pw);
msg = out.toString();
}
// 添加异常信息到Model
mv.addObject("msg", msg);
return mv;
} }
2.4.在Springmvc配置文件中,配置异常处理器
<!-- 配置异常处理页面 -->
<bean class="cn.exception.MyexceptionResolver"></bean>
2.5.编写异常页面
<%@ 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>Insert title here</title>
</head>
<body>
异常发生了...${msg }
</body>
</html>
3.非注解使用异常案例.
package cn.controller; import java.io.PrintWriter;
import java.io.StringWriter; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView; import cn.exception.MyException; @ControllerAdvice
public class ExceptionControllerAdvice { // 处理自定义异常
@ExceptionHandler(MyException.class)
public ModelAndView zdyException(MyException e){
ModelAndView mv = new ModelAndView("error"); mv.addObject("msg", e.getMessage()); return mv;
} // 处理运行时异常
@ExceptionHandler(RuntimeException.class)
public ModelAndView zdyException(RuntimeException ex){
ModelAndView mv = new ModelAndView("error"); mv.addObject("msg", ex.getMessage());
StringWriter out = new StringWriter();
PrintWriter pw = new PrintWriter(out);
ex.printStackTrace(pw);
mv.addObject("msg", out.toString());
return mv;
} }
需要提供自定义异常类,见上面MyException
springmvc异常处理(非注解与注解)的更多相关文章
- SpringMVC的controller方法中注解方式传List参数使用@RequestBody
在SpringMVC控制器方法中使用注解方式传List类型的参数时,要使用@RequestBody注解而不是@RequestParam注解: //创建文件夹 @RequestMapping(value ...
- springMVC学习记录2-使用注解配置
前面说了一下使用xml配置springmvc,下面再说说注解配置.项目如下: 业务很简单,主页和输入用户名和密码进行登陆的页面. 看一下springmvc的配置文件: <?xml version ...
- SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo
使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...
- SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系
一般我们开发时,使用最多的还是@RequestMapping注解方式. @RequestMapping(value = "/", param = "role=guest& ...
- SSM框架之SpringMVC(3)常用注解
SpringMVC(3)常用注解 1. RequestParam注解 1.作用:把请求中指定名称的参数传递给控制器中的形参赋值 2.属性: 1.value:请求参数的每次 2.required ...
- SpringMVC利用AOP实现自定义注解记录日志
作者:飞翔的拖鞋up 推荐:彻底征服 Spring AOP 之 实战篇 推荐:jason_zhangz 本文抛砖引玉,并没有详细的介绍更全面的内容,通过一个例子让初次使用的人能够快速入门,简单的介绍一 ...
- SpringMVC源码解读 - RequestMapping注解实现解读
SpringMVC源码解读 - RequestMapping注解实现解读 - RequestCondition体系 https://www.cnblogs.com/leftthen/p/520840 ...
- SpringMVC异常处理机制详解[附带源码分析]
目录 前言 重要接口和类介绍 HandlerExceptionResolver接口 AbstractHandlerExceptionResolver抽象类 AbstractHandlerMethodE ...
- SpringMVC异常处理机制
SpringMVC异常处理机制 springMVC会将所有在doDispatch方法中的异常捕获,然后处理.无法处理的异常会抛出给容器处理. 在doDispatch()中调用processDispat ...
随机推荐
- 爬虫-python调用百度API/requests
from urllib.request import urlopen import requests import json url = "http://apis.baidu.com/txa ...
- mysql UNION all 实现不对称数据统计
当统计多条的三个参数在不同时间段的数据的sum,又只能写在同一个sql上时,可以考虑union all三次查询, select * from ( select kk.a_time as dates,k ...
- MariaDB二进制包简单安装部署
一.简介: MySQL最早是由Michael Widenius在所研发,而在后来Michael先生以10亿美元的价格把MySQL卖给了SUN以后不久SUN就被Oracle公司给收购了,在Oracle收 ...
- 海康、大华NVR网络硬盘录像机录像无插件全平台访问实现—录像回放时间轴功能实现方法
在之前的博文中我们有介绍方案*NVR硬件录像机web无插件播放方案(支持取特定时间段视频流)*:该片博文旨在介绍时间轴功能的实现和相关接口的调用: 时间轴样式展示: 问题分析 对于 时间轴的展示实现需 ...
- maven实现项目热部署
1.Tomcat的配置 我们需要实现热部署,自然就需要通过maven操作tomcat,所以就需要maven取得操作tomcat的权限,现在这一步就是配置tomcat的可操作权限. 在tomcat的安装 ...
- MySQL中myisam和innodb的主键索引有什么区别?
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...
- Python3.6全栈开发实例[014]
14.好声音选秀大赛评委在打分的时,可以进行输入. 假设,有10个评委.让10个评委进行打分, 要求, 分数必须大于5分, 小于10分. count = 1 while count <= 10: ...
- hexo+yilia页脚添加总访问量
个人博客:https://www.yuehan.online 现在博客:http://www.wangyurui.top 脚本方法使用不蒜子计数 安装脚本 要使用不蒜子(官网:http://busua ...
- LeNet5
Lecun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proc ...
- 《Python 数据分析》笔记——pandas
Pandas pandas是一个流行的开源Python项目,其名称取panel data(面板数据)与Python data analysis(Python 数据分析)之意. pandas有两个重要的 ...