欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMVC 统一的全局的异常处理机制

程序员文章站 2022-04-15 23:23:43
springmvc框架采用的是统一,全局的异常处理,把controller中的所有异常处理都集中到一个地方,采用的是aop的思想。把业务逻辑和异常处理代码分开。异常处理的步骤: 1、创建一个自定义异常类,再定义它的子类异常 2、创建一个普通类,作为全局异常处理类 1)在类的上面加入@ControllerAdvice 2)在类中定义方法,方法的上面加入@ExpectationHandler ......

springmvc框架采用的是统一,全局的异常处理,把controller中的所有异常处理都集中到一个地方,采用的是aop的思想。把业务逻辑和异常处理代码分开。

异常处理的步骤:

1、创建一个自定义异常类,再定义它的子类异常

2、创建一个普通类,作为全局异常处理类

1)在类的上面加入@ControllerAdvice

2)在类中定义方法,方法的上面加入@ExpectationHandler

处理抛出的异常:

@ControllerAdvice:控制器增强,就是给控制器类增加功能(处理异常的功能)

位置:在类的上面

特点:必须让框架知道这个注解的包名,需要在springMVC配置文件中声明组件扫描器

指定@ControllerAdvice所在的包名位置

定义类方法处理发生的异常

处理异常的方法和控制器方法的定义一样,可以由多个参数,可以有ModelAndView String..

形参:Exception,表示Controller中抛出的异常对象

通过形参可以获取发生异常的信息

在方法上面加注解@ExceptionHandle(异常的class):表示异常的类型,当发生此类异常时当由此方法处理

3、在controller抛出异常

4、创建处理异常的视图页面

5、创建springmvc的配置文件

1)组件扫描器,扫描@controller注解

2)组件扫描器,扫描@ControllerAdvice所在包名

3)声明注解驱动

代码演示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="textml; charset=UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="user/some.do" method="post">
        姓名:<input type="text" name="name"><br/>
        年龄:<input type="text" name="age"><br/>
        <input type="submit" value="提交请求">
    </form>
</body>
</html>

Controler类中

@RequestMapping(value = "/user")
@Controller
public class myController {
    @RequestMapping(value = "/some.do")
    public ModelAndView dosome(String name,String age) throws myException {
        ModelAndView mv = new ModelAndView();
        //根据请求的参数抛出异常
        if("".equals(name)){
            //抛出的异常交给框架处理
            throw new nameException("姓名不为空");
        }
        if (!isNum(age)) {
            throw  new ageException("年龄输入非数字");
        }
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }
    public boolean isNum(String str){
        try {
            Integer.parseInt(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}

异常类:

public class myException extends Exception {
    public myException() {
        super();
    }
    public myException(String message) {
        super(message);
    }
}
/**
 * 年龄出现异常,抛出异常
 */
public class ageException extends myException {
    public ageException() {
        super();
    }
    public ageException(String message) {
        super(message);
    }
}
/**
 * name出现异常,抛出异常
 */
public class nameException extends myException {
    public nameException() {
        super();
    }
    public nameException(String message) {
        super(message);
    }
}

处理抛出的异常

@ControllerAdvice
public class ExceptionHandle {
    @ExceptionHandler(value = nameException.class)
    public ModelAndView doNameException(Exception exception){
        ModelAndView mv  = new ModelAndView();
        mv.addObject("tips","姓名不为空!!");
        mv.addObject("ex",exception);
        mv.setViewName("nameError");
        return mv;
    }
    @ExceptionHandler(value = ageException.class)
    public ModelAndView doAgeException(Exception exception){
        ModelAndView mv  = new ModelAndView();
        mv.addObject("tips","年龄输入错误!!");
        mv.addObject("ex",exception);
        mv.setViewName("ageError");
        return mv;
    }
    //其他的错误信息处理
    @ExceptionHandler
    public ModelAndView doOtherException(Exception exception){
        ModelAndView mv  = new ModelAndView();
        mv.addObject("tips","其他异常错误!!");
        mv.addObject("ex",exception);
        mv.setViewName("otherError");
        return mv;
    }

} 

异常显示jsp页面:其他大同小异

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ageError.jsp的错误信息<br/>
    ${tips}<br/>
    ${ex.message}<br/>
</body>
</html> 

定义 SpringMVC 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <context:component-scan base-package="cn.com.Ycy.Contrller"/>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 前缀名:视图文件的路径-->
            <property name="prefix" value="/WEB-INF/"/>
            <!-- 后缀名:视图文件的扩展名 -->
            <property name="suffix" value=".jsp"/>
        </bean>
        <!-- 处理异常的两步  -->
        <context:component-scan base-package="cn.com.Ycy.handle"/>
        <mvc:annotation-driven/>
</beans> 

本文地址:https://blog.csdn.net/weixin_43725517/article/details/108253018