spring mvc 异常处理(全局、局部异常)

异常处理

  • 局部的异常处理器,只针对某个控制器

// 专门定义一个处理异常的方法,如: ArrayIndexOutOfBoundsException 异常
@ExceptionHandler(Exception.class) // 异常处理器, 可以指定具体的异常类型
public String error(Exception e) {
    System.out.println("进入了 ExceptionController error " + e.getMessage());
    return "error";
}

  • 全局的异常处理器,针对所有的控制器

@ControllerAdvice
class 全局异常处理器类 {

    @ExceptionHandler(异常类型)
    public String error(异常对象) {
        // 异常处理
        return "视图名";
    }
}

注:局部的异常处理优先级高于全局的异常处理,因此两个都有的时候,会先执行局部,再到全局。

代码演示

1、局部异常处理器

局部异常处理类

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ExceptionController {

    // 传统的方式, 处理控制器出现的异常,出现异常就跳到error.jsp页面
    /*@RequestMapping("/e1")
    public String e1() {
        try {
            System.out.println("进入了 ExceptionController e1");
            int [] a = {};
            System.out.println(a[0]);
            return "hello";
        } catch (Exception e) {
            return "error";
        }
    }*/

    // spring mvc 的方式, 处理异常
    @RequestMapping("/e1")
    public String e1() {
        System.out.println("进入了 ExceptionController e1");
        int [] a = {};
        System.out.println(a[0]);
        return "hello";
    }

    // 专门定义一个处理异常的方法
    //异常处理器, 可以指定具体的异常类型 如: ArrayIndexOutOfBoundsException
    @ExceptionHandler(Exception.class)  
    public String error(Exception e) {
        //e.getMessage() 打印错误信息
        System.out.println("进入了 ExceptionController error " + e.getMessage());
        return "error";
    }
}

error.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
美化的,显示错误的页面
</body>
</html>

结果

控制台(服务器)输出以下信息,表示数组下标越界异常,异常就跳转到error.jsp页面

进入了 ExceptionController e1
进入了 ExceptionController error 0

2、全局异常处理器

全局异常处理类

// 全局的异常处理器类
@ControllerAdvice
public class ExceptionAspect {
    //定义异常类型
    @ExceptionHandler(Exception.class)
    public String exception(Exception e) {
        System.out.println("全局异常处理方法..." + e.getMessage());
        return "error";
    }
}

如果代码出现异常,会由全局异常处理器,处理异常

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ExceptionController {

    @RequestMapping("/e1")
    public String e1() {
        System.out.println("进入了 ExceptionController e1");
        int [] a = {};
        System.out.println(a[0]);
        return "hello";
    }
}

结果

跳到的还是上面那张图的页面,控制台上输出以下:

进入了 ExceptionController e1
全局异常处理方法...0

最重要的一点是,当全局和局部异常处理器都存在时,根据就近原则,局部异常处理器会优先于全局异常处理器执行。

猜你喜欢

转载自blog.csdn.net/grey_mouse/article/details/87898323