沃梦达 / IT编程 / 数据库 / 正文

深入聊一聊springboot项目全局异常处理那些事儿

Spring Boot是一个非常流行的Java框架,其主要优点之一是非常简单地设置全局异常处理程序。本文将在解释全局异常处理的基本概念的基础上,提供两个示例,以帮助你更好地理解和使用此功能。

深入聊一聊Spring Boot项目全局异常处理那些事儿

Spring Boot是一个非常流行的Java框架,其主要优点之一是非常简单地设置全局异常处理程序。本文将在解释全局异常处理的基本概念的基础上,提供两个示例,以帮助你更好地理解和使用此功能。

SpringBoot全局异常处理基础知识

全局异常处理是指在整个应用程序中捕获并处理抛出的异常。对于Java应用程序而言,全局异常处理在某些情况下非常重要,因为它可以大大提高应用程序的可靠性。

Spring Boot的全局异常处理主要通过自定义异常处理器实现。在Spring中,异常处理器主要通过实现HandlerExceptionResolver接口来实现。Spring Boot则提供了一个更简单的方式来处理异常:通过添加@ControllerAdvice注解的类。

@ControllerAdvice是一个用于定义@ExceptionHandler@InitBinder@ModelAttribute方法的注解。其中,@ExceptionHandler被用于处理异常。

以下是一些基本的全局异常处理方法。

@ControllerAdvice
public class GlobalExceptionHandler {

    //处理RuntimeException并返回错误信息 HTTP状态码为500
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public String handleRuntimeException(RuntimeException ex) {
        return "系统错误:"+ex.getMessage();
    }

    //处理自定义异常CustomException并返回错误信息 HTTP状态码为400
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public String handleCustomException(CustomException ex) {
        return "自定义异常:"+ex.getMessage();
    }
}

上述代码演示了如何定义全局异常处理方法。在这个例子中,我们使用了@ControllerAdvice注解来定义一个全局异常处理程序并处理RuntimeException和自定义异常CustomException,并且返回特定的错误文本。

具体实现

通常情况下,我们定义全局异常处理程序的实际过程如下:

  1. 创建异常类并继承RuntimeExceptionException,根据异常实际情况实现自定义的异常信息。
  2. 创建全局异常处理类,通过@ControllerAdvice注解来声明类,并添加@ExceptionHandler注解来指示要处理哪个具体的异常类。
  3. 处理异常时,可以返回一个特定的错误页面或错误信息。

以下是两个具体的实现示例:

第一个示例

假设在我们的应用程序中,我们有一个自定义的ResourceNotFoundException异常,它被用于处理用户请求不存在的资源时抛出。在这种情况下,我们可以创建一个全局异常处理类来处理所有的ResourceNotFoundException异常。代码如下:

自定义异常类

public class ResourceNotFoundException extends RuntimeException {

    private String resourceName;
    private String fieldName;
    private Object fieldValue;

    public ResourceNotFoundException(String resourceName, String fieldName, Object fieldValue) {
        super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue));
        this.resourceName = resourceName;
        this.fieldName = fieldName;
        this.fieldValue = fieldValue;
    }

    public String getResourceName() {
        return resourceName;
    }

    public String getFieldName() {
        return fieldName;
    }

    public Object getFieldValue() {
        return fieldValue;
    }
}

全局异常处理类

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    protected ResponseEntity<Object> handleResourceNotFound(
            ResourceNotFoundException ex) {
        ExceptionResponse response = new ExceptionResponse(ex.getMessage(), HttpStatus.NOT_FOUND);
        return new ResponseEntity<Object>(response, HttpStatus.NOT_FOUND);
    }
}

ErrorResponse类

public class ExceptionResponse {

    private String message;
    private HttpStatus status;

    public ExceptionResponse(String message, HttpStatus status) {
        super();
        this.message = message;
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public HttpStatus getStatus() {
        return status;
    }

    public void setStatus(HttpStatus status) {
        this.status = status;
    }

}

在这个示例代码中,我们使用了一个@ControllerAdvice注解的类RestExceptionHandler来定义全局异常处理程序,并添加了@ExceptionHandler注解来指示要处理ResourceNotFoundException异常。在异常处理方法中,我们返回了一个ErrorResponse对象,其中包含了我们定义的异常消息和HTTP响应码。

第二个示例

假设我们的应用程序中有一个自定义的CustomException异常,它被用于处理我们自己的业务逻辑异常。在这种情况下,我们可以创建一个全局异常处理类来处理所有的CustomException异常。代码如下:

自定义异常类

public class CustomException extends RuntimeException {

    public CustomException(String message) {
        super(message);
    }

}

全局异常处理类

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ModelAndView handleCustomException(HttpServletRequest request, Exception ex){

        ModelAndView model = new ModelAndView("custom_error");
        model.addObject("exception", ex);
        model.addObject("url", request.getRequestURL());

        return model;
    }
}

在这个示例代码中,我们使用了一个@ControllerAdvice注解的类GlobalExceptionHandler来定义全局异常处理程序,并添加了@ExceptionHandler注解来指示要处理CustomException异常。在处理异常方法中,我们返回一个错误视图和一些附加的数据,例如异常消息和请求URI。

总结

在Spring Boot应用程序中,全局异常处理程序是实现强大和可靠的应用程序的重要组成部分。使用@ControllerAdvice注解,我们可以轻松地开发自己的全局异常处理程序。

在这篇文章中,我们探讨了全局异常处理程序的基本概念,并给出了两个不同的示例。如有疑问或建议,欢迎留言讨论。

本文标题为:深入聊一聊springboot项目全局异常处理那些事儿