day40异常处理步骤:
springmvc异常处理使用了AOP思想
1.新建maven web项目
2.加入依赖
3.新建一个自定义异常类 MyUserExecution,再定义它的字类 NameException,AgeException
4.在controller抛出NameException,AgeException
5.新建一个普通类,作用全局异常处理类
(1)在类的上面加入@ControllerAdvice
(2)在类中定义方法,方法的上面加入@ExceptionHandler
6.创建处理异常的视图页面
7.创建springmvc的配置文件
(1)组件扫描器,扫描@Controller注解
(2)组件扫描器,扫描@ControllerAdvice所在的包名
(3)声明注解驱动
(1)controller类
@Controller
@RequestMapping("/student")
public class StudentController {
@RequestMapping("/addStudent")
public ModelAndView addStudent(String name,Integer age) throws MyUserException {
ModelAndView mv = new ModelAndView();
if (!"zs".equals(name) & age == null || age > 80){
throw new NameAndAgeException("姓名和年龄都出错");
}
if (!"zs".equals(name)){
throw new NameException("姓名不正确!!!");
}
if (age == null || age > 80){
throw new AgeException("年龄比较大");
}
mv.addObject("name", name);
mv.addObject("age", age);
mv.setViewName("show");
return mv;
}
}
(2)exception包其中一个异常类
package com.itcast.execption;
public class AgeException extends MyUserException {
public AgeException() {
super();
}
public AgeException(String message) {
super(message);
}
}
(3)控制器增强类ControllerAdvice
/**
* @ControllerAdvice:控制器增强(控制器通知,也就给Controller类增加功能————异常处理功能)
* 位置:在类上面
* 特点:必须让框架知道这个注解所在的包名,需要在springmvc配置文件声明组件扫描器
* 指定@ControllerAdvice
*
*/
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* 定义处理方法,处理发生的异常
* 处理异常的方法和控制器方法的定义一样,可以有多个参数,可以有ModelAndView,String,
* Void,对象类型的返回值
*
* 形参:Exception,表示Controller中抛出的异常对象。
* 通过形参可以获取发生的异常信息。
*
* @ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时,由当前方法处理
*/
@ExceptionHandler(value = NameException.class)
public ModelAndView doNameException(Exception exception){
//处理NameException的异常
/*
异常发生处理逻辑:
1.需要把异常记录下来,记录到数据库,日志文件。
记录日志发生的时间,哪个方法发生的,异常错误内容
2.发送通知,把异常的信息通过邮件,短信,微信发给相关人员
3.给用户友好提示。
*/
ModelAndView mv = new ModelAndView();
// mv.addObject("msg", "名字必须是zhangsan,其他群殴你过户无法访问");
mv.addObject("ex",exception);
mv.setViewName("nameError");
return mv;
}
@ExceptionHandler(value = AgeException.class)
public ModelAndView doAgeException(Exception exception){
//处理AgeException的异常
/*
异常发生处理逻辑:
1.需要把异常记录下来,记录到数据库,日志文件。
记录日志发生的时间,哪个方法发生的,异常错误内容
2.发送通知,把异常的信息通过邮件,短信,微信发给相关人员
3.给用户友好提示。
*/
ModelAndView mv = new ModelAndView();
// mv.addObject("msg", "年龄不能超过80");
mv.addObject("ex",exception);
mv.setViewName("ageError");
return mv;
}
/*
处理其他异常,NameException,AgeException以外,不知类型的异常
@ExceptionHandler:这种没有定义的只能有一个,相当于else
*/
@ExceptionHandler
public ModelAndView doOtherException(Exception exception){
//处理其他异常
ModelAndView mv = new ModelAndView();
// mv.addObject("msg", "其他异常");
mv.addObject("ex",exception);
mv.setViewName("otherError");
return mv;
}
}
(4)扫描@ControllerAdvice控制器增强类所在的包名
<!-- 扫描handler中所在的包-->
<context:component-scan base-package="com.itcast.handler"></context:component-scan>
(5)异常定义的视图页面(其一)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ageError</title>
</head>
<body>
<h2>异常信息是:${msg}.jsp</h2><br>
<h2>异常内容是:${ex.message}</h2>
</body>
</html>