异常处理


异常处理

@ExceptionHandler和@ResponseStatus

@ExceptionHandler

@ExceptionHandler标识的方法的参数 必须在异常类型(Throwable或其子类) 中,不能包含其他类型的参数。
例如:
有一个异常

    @RequestMapping("testExceptionHandler")
   public String testExceptionHandler() {
       System.out.println(1/0);//触发异常
       
       return "successe";
   }

在同一个类中编写如下方法:


    //该方法可以捕获本类中抛出的ArithmeticException异常
    @ExceptionHandler({ArithmeticException.class})
    public ModelAndView handlerArithmeticException(ArithmeticException e) {
        ModelAndView mv=new ModelAndView("error");
        System.out.println(e);
        mv.addObject("e",e);
        return mv;
    }

使用ModelAndView是为了跳转到错误页面。
error.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    ${requestScope.e}
</body>
</html>

@ExceptionHandler默认只能捕获 当前类中的异常方法。
如果发生异常的方法 和处理异常的方法 不在同一个类中:则使用@ControllerAdvice

package org.cduck.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice//加了该注解可以捕获其它类中的异常
public class MyExceptionController {//不是控制器,仅仅是专门用来处理异常的类

    
    @ExceptionHandler({Exception.class})
    public ModelAndView handlerArithmeticException2(Exception e) {
        ModelAndView mv=new ModelAndView("error");
        System.out.println(e+"22222222222");
        mv.addObject("e",e);
        return mv;
    }
}

总结:如果一个方法用于处理异常,并且只处理当前类中的异常:@ExceptionHandler
如果一个方法用于处理异常,并且处理所有类中的异常: 类前加@ControllerAdvice、 处理异常的方法前加@ExceptionHandler

@ResponseStatus(自定义异常显示页面)

有一数组越界异常可用以下方法定制异常显示页面

@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="数组越界222!!!")
public class MyArrayIndexOutofBoundsException extends Exception {//自定义异常

}

文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录