SpringMVC统一异常处理(Controller处理)

1、  在一个controller内的统一处理示例

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ExceptionHandler;

@RestController
public class TestCtl {

    @RequestMapping("/ready")
    public String ready(){
            throw new RuntimeException("ready抛出的异常");
    }
    
    @ExceptionHandler
    public String ExceptionHandler(Exception e) {
            return e.getMessage();
    }
}

请求结果:

也可以自定义Exception,但最好是RuntimeException的子类,以避免“检查异常”必须被处理而造成代码冗余;

    @ExceptionHandler是Spring MVC已有的注解,可用于Controller、ControllerAdvice、RestControllerAdvice类的异常处理。

 

2、 使用ControllerAdvice对同一类异常做统一处理示例:

Controller

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestCtl {

    @RequestMapping("/ready")
    public String ready(){
            throw new RuntimeException("ready抛出的异常");
    }
}

 统一异常拦截类

import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Order(0)
@RestControllerAdvice(annotations = RestController.class)
public class RestCtlAdvice {

@ExceptionHandler
@ResponseBody //RestControllerAdvice中无需添加此注解,同RestController
    public String ExceptionHandler(Exception e) {
            return e.getMessage();
    }
}

     最后运行结果同1,RestCtlAdvice会对所有RestController中的异常进行处理,如果是Exception(此可以是自定义的特定异常的精细处理)类型异常,RestCtlAdvice类可以有多处,处理顺序按照给定的order来运行。RestController.class也可以替换为Controller.class,则对所有Controller的异常进行拦截。 

     Java 异常体系设计的目的在于通过使用少量代码,实现大型、健壮、可靠程序。异常处理是 Java 中唯一正式的错误报告机制。异常处理机制最大的好处就是降低错误代码处理的复杂程度。

      如果不使用异常,那么就必须在调用点检查特定的错误,并在程序的很多地方去处理它;如果使用异常,那么就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误。因此只需要在一个地方处理错误,这种方式不仅节省代码,而且把“描述正确执行过程做什么事”和“出了问题怎么办”相分离。

posted @ 2020-03-31 13:53  覆手为云p  阅读(1520)  评论(0编辑  收藏  举报
停止精灵球