spring boot 默认异常处理的实现

Spring Boot 默认的异常处理机制可以根据不同的异常类型,自动返回对应的 HTTP 状态码,同时输出异常信息,帮助我们快速定位错误。

默认情况下,无需显式配置,Spring Boot 就可以捕获控制器方法抛出的异常及一些框架内部异常。当异常被捕获后,Spring Boot 会根据异常类型来自动选择以下处理步骤:

  1. 如果是 HTTP 400 错误,返回 Bad Request 响应码。
  2. 如果是 HTTP 404 错误,返回 Not Found 响应码。
  3. 如果是 HTTP 405 错误,返回 Method Not Allowed 响应码。
  4. 如果是 HTTP 415 错误,返回 Unsupported Media Type 响应码。
  5. 如果是 HTTP 406 错误,返回 Not Acceptable 响应码。
  6. 如果异常时运行时异常(RuntimeException),则返回 HTTP 500 Internal Server Error 响应码。
  7. 如果是其他异常,则返回我们设定的默认响应码。

此外,Spring Boot 还提供了自定义异常处理机制。我们可以通过编写一个全局异常处理器,来捕获 Spring Boot 在处理异常时未能成功处理的异常,并对异常进行特定的处理操作。以下是一个示例代码:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public BaseResponse handleException(HttpServletRequest request, Exception e) {
        BaseResponse response = new BaseResponse();
        response.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
        response.setMessage(e.getMessage());
        return response;
    }

    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public BaseResponse handleBusinessException(HttpServletRequest request, BusinessException ex) {
        BaseResponse response = new BaseResponse();
        response.setCode(ex.getCode());
        response.setMessage(ex.getMessage());
        return response;
    }
}

上述示例代码中,我们通过使用 @ControllerAdvice 注解声明全局异常处理器,然后通过使用 @ExceptionHandler 注解来处理具体的异常类型。当 Spring Boot 在处理异常时遇到了这些异常类型时,就使用对应的处理函数来返回相应的结果。

例如,在上述示例中处理 BusinessException 时,返回的结果中包含了自定义错误码和错误信息。

另外,我们也可以通过重写 Spring Boot 提供的 ErrorController 接口,来自定义异常的返回信息格式和内容,以下是一个示例代码:

@RestController
public class CustomErrorController implements ErrorController {

    @RequestMapping("/error")
    public BaseResponse handleError(HttpServletRequest request) {
        BaseResponse response = new BaseResponse();

        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == HttpStatus.NOT_FOUND.value()) {
            response.setCode(HttpStatus.NOT_FOUND.value());
            response.setMessage("Sorry, the resource you requested is not found.");
        } else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
            response.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
            response.setMessage("Sorry, something unexpected happened.");
        } else {
            response.setCode(statusCode);
            response.setMessage("Sorry, an error occurred.");
        }

        return response;
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

上述示例代码中,我们通过实现 ErrorController 接口,将 /error 请求路由到一个新的函数中处理。在这个处理函数中,我们可以根据请求的 HTTP 响应码来自定义异常信息的格式和内容。

例如,当请求出现 404 错误时,返回的结果中会包含 “Sorry, the resource you requested is not found.” 的提示信息。

总的来说,Spring Boot 提供了默认的异常处理机制,并允许我们通过自定义异常处理器和重写 ErrorController 接口来进一步扩展和定制这一机制,以便更好地适应我们的应用程序需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot 默认异常处理的实现 - Python技术站

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

相关文章

  • springboot如何统一设置时区

    当使用Spring Boot运行Java应用程序时,可以很容易地设置应用程序的时区。下面是如何进行设置的攻略: 导入依赖 在Maven项目中,需要添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring…

    Java 2023年5月20日
    00
  • Java 锁的知识总结及实例代码

    Java 锁的知识总结及实例代码 在 Java 中,锁机制是一个非常重要的多线程编程的知识点。下面对 Java 锁相关的知识进行总结,并提供两个示例代码说明锁机制的应用。 概念 互斥锁(mutex):用于控制对共享资源的访问。对于任一个时刻,只有一个线程可以访问共享资源,其他的线程必须等待。 读写锁(ReadWriteLock):允许多个线程同时读共享资源,…

    Java 2023年5月23日
    00
  • 聊一聊Java反射

    聊一聊Java反射 反射是Java面向对象编程中的一种重要机制,通过反射可以在运行时获取类的信息,以及操作类的实例对象。在Java编程中,反射具有广泛的应用价值,例如通过反射动态创建对象,访问对象的私有成员变量和方法等。本文将为你详细讲解Java反射的完整攻略,包含了反射的基本使用方法、常见的场景应用以及对性能的影响等方面。 反射的基本使用方法 要使用反射,…

    Java 2023年5月19日
    00
  • Java与MySQL时间不一致问题解决

    下面是Java与MySQL时间不一致问题的解决攻略。 问题描述 在Java应用程序中,当使用JDBC连接MySQL数据库时,由于Java和MySQL的时间格式不同,经常会出现时间不一致的问题,例如,数据库中的时间是2020-06-01 12:00:00,但在Java程序中读取时却变成了2020-06-01 08:00:00。 解决方法 为了解决Java和My…

    Java 2023年5月20日
    00
  • java实现验证码小程序

    我将为你讲解“Java实现验证码小程序”的完整攻略。 目录 什么是验证码 验证码实现的基本思路 Java实现验证码小程序详解 第一步:生成验证码字符 第二步:绘制验证码图片 第三步:输出图片到页面 示例说明 示例1:生成随机字符串 示例2:绘制验证码图片 什么是验证码 验证码是指一种用于区分用户是计算机还是真实用户的图形或文字信息。常用于防止恶意的程序自动提…

    Java 2023年5月23日
    00
  • java使用RandomAccessFile类基于指针读写文件实例代码

    下面是完整的“java使用RandomAccessFile类基于指针读写文件实例代码”的攻略: 1. RandomAccessFile类 RandomAccessFile类可以让我们在文件中进行读写操作,它支持在文件任意位置进行数据读写,因此它非常适用于对文件进行随机访问(Random Access)操作。RandomAccessFile类有两个构造方法: …

    Java 2023年6月1日
    00
  • Java遍历集合方法分析(实现原理、算法性能、适用场合)

    Java遍历集合是每个Java开发者都必须学会的一个技能。它是处理集合数据的重要步骤。本文将详细讲解Java遍历集合方法的实现原理、算法性能和适用场合。 什么是Java集合 Java集合是Java语言提供的一组数据结构,用于存储数据的容器。它们是一种实用工具,可用于处理复杂的数据结构,例如列表、队列、栈、哈希表等。Java集合框架是一组接口和类的集合,用于处…

    Java 2023年5月19日
    00
  • JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】

    JavaScript创建对象方式总结 在JavaScript中,我们可以使用多种方式来创建对象,包括工厂模式、构造函数模式、原型模式等。下面将针对每种方式进行详细讲解。 工厂模式 工厂模式是一种基本的对象创建方式,通过工厂函数来创建对象。这种方式可以避免重复代码,提高了代码的可复用性。 实现一个创建人物的工厂,示例代码如下: function createP…

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