SpringBoot如何优雅的处理全局异常

Spring Boot是一款轻量级、简单易用、易于上手的Web开发框架,它为我们提供了许多方便,其中之一就是可以非常方便的处理全局异常。在一个Web应用中,无论怎么小心、怎么仔细,都难免会出现一些意外情况,如数据库访问错误、输入非法参数、网络断开、框架异常等等。对于这些异常,Spring Boot提供了几种优雅的方式来处理。

方式一:@ControllerAdvice + @ExceptionHandler

在Spring Boot中,我们可以通过@ControllerAdvice注解结合@ExceptionHandler注解来处理全局异常。具体的做法是,在一个类上添加@ControllerAdvice注解,然后在该类内部编写@ExceptionHandler注解的方法,这些方法对应不同的异常类型,如下面的例子所示。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleException(HttpServletRequest request, Exception e) {
        //TODO:记录异常日志等操作
        return "error";//返回一个错误页面
    }

    @ExceptionHandler(IOException.class)
    public String handleIOException(HttpServletRequest request, IOException e) {
        //TODO:记录异常日志等操作
        return "io_error";//返回一个IO异常页面
    }
}

上面的代码中,我们定义了一个全局异常处理类GlobalExceptionHandler,其中有两个方法,分别用来处理Exception和IOException异常。当系统抛出这两种异常时,Spring Boot框架会自动调用对应的方法来处理异常。我们可以在这些方法中编写任意的代码来记录异常日志、发送邮件通知等操作。

值得一提的是,我们可以在这些方法中返回一个View对象,这个View对象代表了我们的错误页面。例如,上面的代码中,当抛出Exception异常时,我们返回一个名为error的View对象,表示返回error.html页面;当抛出IOException异常时,我们返回一个名为io_error的View对象,表示返回io_error.html页面。这样,我们就能够根据不同的异常类型,返回不同的错误页面。

方式二:@ControllerAdvice + @ResponseStatus

除了使用@ExceptionHandler注解外,我们还可以使用@ResponseStatus注解来处理全局异常。它的做法是,我们先定义一个自定义异常类,然后在这个自定义异常类上添加@ResponseStatus注解,并指定我们想要返回的HTTP错误码。然后,在全局异常处理类(即添加了@ControllerAdvice注解的类)中,捕获这个自定义异常,Spring Boot框架会自动返回我们指定的HTTP错误码。

@ResponseStatus(HttpStatus.BAD_REQUEST)
public class MyBadRequestException extends Exception {
}

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MyBadRequestException.class)
    public ResponseEntity<String> handleException(HttpServletRequest request, MyBadRequestException e) {
        return new ResponseEntity<>("Bad Request", HttpStatus.BAD_REQUEST);
    }
}

上面的代码中,我们定义了一个自定义异常类MyBadRequestException,同时指定了它的HTTP错误码为400(即BAD_REQUEST)。然后,在GlobalExceptionHandler类中,捕获这个自定义异常类,并返回一个HTTP状态码为400的ResponseEntity对象,代表了一个“Bad Request”错误响应。

值得一提的是,使用@ResponseStatus注解有一个缺点,就是我们不能返回一个View对象。因此,如果我们需要返回错误页面,建议使用@ExceptionHandler注解。

示例一:捕获自定义异常

下面是一个使用@ExceptionHandler和自定义异常类的示例代码,它演示了如何捕获我们自己抛出的异常,以及如何返回一个错误页面。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MyException.class)
    public String handleException(HttpServletRequest request, MyException e) {
        return "error";//返回一个名为error.html的错误页面
    }
}

public class MyException extends Exception {
}

上面的代码中,我们定义了一个自定义异常类MyException,并在GlobalExceptionHandler类中添加了一个@ExceptionHandler注解的方法,用来处理MyException异常。当系统抛出MyException异常时,Spring Boot框架会自动调用对应的方法来处理异常,并返回一个名为error.html的错误页面。

示例二:异常统一处理

下面是一个使用@ControllerAdvice和@ExceptionHandler的示例代码,它演示了如何捕获全局异常,并将它们转换为规范的JSON格式返回。

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<Map<String, Object>> handleException(HttpServletRequest request, Exception e) {
        Map<String, Object> error = new HashMap<>();
        error.put("status", HttpStatus.INTERNAL_SERVER_ERROR.value());
        error.put("message", e.getMessage());
        return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

上面的代码中,我们定义了一个GlobalExceptionHandler类,并在该类上添加了@ControllerAdvice注解。然后,在这个类中添加了一个@ExceptionHandler注解的方法,用来处理所有的Exception异常。当系统抛出任何一种Exception异常时,Spring Boot框架都会自动调用对应的方法来处理异常,并将它们转换为一个Map对象,并最终通过一个ResponseEntity对象返回。

为了方便演示,上面的代码中只返回了异常的HTTP状态码和异常信息,我们也可以自由地定制我们的返回数据,例如,增加timeStamp、error等信息。这样做的好处在于,我们能够将异常信息转换为规范的JSON格式,并通过任意的手段(例如REST API)返回给调用者。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot如何优雅的处理全局异常 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Hibernate 与 Mybatis 的共存问题,打破你的认知!(两个ORM框架)

    Hibernate 与 Mybatis 的共存问题,打破你的认知!(两个ORM框架) 背景介绍 Hibernate 和 Mybatis 都是 Java 中常用的 ORM 框架,可以用来操作数据库。相比较于传统的 JDBC 操作数据库,ORM 框架具备更高的抽象性和易用性。Hibernate 和 Mybatis 都有其自身的特点和优势,因此在一些情况下,我们需…

    Java 2023年5月20日
    00
  • Hibernate Validator实现更简洁的参数校验及一个util

    那我来为您讲解一下Hibernate Validator实现更简洁的参数校验及一个util的完整攻略。 1. 简介 Hibernate Validator是一个基于Java Bean验证规范(JSR-303,JSR-349)的校验框架,可以用来校验JavaBean中的字段,包括对基本类型、日期、字符串等数据类型的支持。Hibernate Validator提…

    Java 2023年5月20日
    00
  • Spring Security实现接口放通的方法详解

    Spring Security实现接口放通的方法详解 在使用Spring Security时,有时需要对一些接口进行放通,不需要进行权限验证,那么该如何实现呢?下面让我们一起来详细讲解Spring Security如何实现接口放通。 1. 使用antMatchers()方法实现接口放通 antMatchers()方法可以用来指定要放行的接口url,可以使用通…

    Java 2023年6月3日
    00
  • mysql jdbc连接步骤及常见参数

    MySQL是一个常见的开源关系型数据库管理系统,在Java中通常使用JDBC(Java Database Connectivity)连接MySQL数据库。下面是MySQL JDBC连接步骤及常见参数的完整攻略。 JDBC连接MySQL的步骤 连接MySQL需要进行以下步骤: 加载MySQL JDBC驱动程序:Class.forName(“com.mysql.…

    Java 2023年5月20日
    00
  • Java基础之Bean的创建、定位和使用

    Java基础之Bean的创建、定位和使用 在Java开发中,Bean是非常常用的一种Java类。Bean是一种被特殊编写的Java类,通常用于封装和传输数据,它拥有以下几个特点: 具有无参构造器 具有getter/setter方法 实现序列化接口 下面我们将对Bean的创建、定位和使用进行详细讲解。 Bean的创建 JavaBean的创建需要满足上述特点,以…

    Java 2023年5月26日
    00
  • Java14发布了,再也不怕NullPointerException了

    Java14发布了,再也不怕NullPointerException了 自从Java诞生以来,空指针异常NullPointerException就一直是开发者最常见的错误之一。但是,随着Java版本的更新,我们终于迎来了一次改变。Java14发布了,它带来了一系列的特性和改进,其中最引人注目的就是JDK Enhancement Proposal 358(JE…

    Java 2023年5月20日
    00
  • Java将CSV的数据发送到kafka的示例

    下面是Java将CSV的数据发送到kafka的示例的详细攻略: 准备工作 首先,在本地安装kafka和创建一个名为test的topic。同时,在项目中引入以下依赖库: <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <arti…

    Java 2023年5月20日
    00
  • 使用java数组 封装自己的数组操作示例

    使用Java数组,封装自己的数组操作是Java开发中比较常见的任务,本攻略将为您提供两个示例来说明如何封装自己的数组操作。 1. 实现数组反转的方法 在编写Java程序时,我们经常需要将数组进行反转。封装一个数组反转的方法是很有必要的。下面是一个代码示例: public static int[] reverse(int[] array){ int[] res…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部