前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >张三进阶之路 | 基于SpringCloud的异常处理

张三进阶之路 | 基于SpringCloud的异常处理

原创
作者头像
GoBoy
发布2024-04-24 15:24:20
1170
发布2024-04-24 15:24:20
举报
文章被收录于专栏:GoboyGoboy

剧情简介

张三,一位充满热情和创造力的程序猿,就职于一家名为 "CloudBookStore" 的在线书店。这家书店采用了先进的 Spring Cloud 技术栈进行构建,为用户提供了一个直观且易于使用的界面。用户可以在这个界面上浏览、搜索和购买各类书籍,同时,CloudBookStore 还提供了一个功能强大的 API,供第三方开发者集成和扩展其功能。

然而,随着业务的不断发展和用户量的增长,张三发现现有的异常处理机制存在一些问题。由于异常处理方法之间的耦合度较高,导致代码难以维护和扩展。为了解决这一问题,张三主动向老板请缨,表示愿意承担优化异常处理流程的重任,为公司的未来发展贡献自己的力量。

经过深思熟虑,张三决定采用基于 Spring Cloud 的统一异常处理方法来实现这一目标。他的目标是确保在出现任何问题时,都能向用户提供清晰、一致的反馈,从而提高用户体验和满意度。

在这个场景中,用户的交互过程如下:用户通过 CloudBookStore 的网站或 API 检索书籍信息。在此过程中,用户可能会遇到各种问题,如请求的资源不存在、权限不足或系统内部错误等。

当这些问题发生时,应用程序会抛出一个异常。这些异常可能是 CloudBookStore 自定义的异常(如 ResourceNotFoundExceptionPermissionDeniedException),也可能是其他类型的异常(如数据库连接错误或空指针异常)。

为了捕获和处理这些异常,张三设计了一个全局异常处理器(GlobalExceptionHandler),并将其应用于整个应用程序。这个处理器会根据异常的类型和严重程度生成一个适当的错误响应,并将其发送回用户。

错误响应中包含一个状态码(如 404 表示资源未找到,500 表示内部服务器错误)和一个详细的错误消息。这些信息不仅可以帮助用户了解问题的原因,还能指导他们采取相应的措施来解决问题。

除了向用户返回错误响应外,张三的全局异常处理器还可以记录异常信息。这些信息对于开发人员来说非常有用,因为它们可以帮助调试和监控系统的健康状况。通过实时监控和分析异常数据,开发人员可以及时发现并解决问题,从而提高系统的稳定性和可靠性。

场景实现

在上述场景中,我们可以使用以下代码来实现全局异常处理器

创建一个自定义异常类 CustomException,继承自 RuntimeException

代码语言:javascript
复制
public class CustomException extends RuntimeException {
    private int status;
    private String message;

    public CustomException(int status, String message) {
        super(message);
        this.status = status;
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    @Override
    public String getMessage() {
        return message;
    }
}

创建一个全局异常处理器类 GlobalExceptionHandler,并使用 @ControllerAdvice 注解标记该类。在这个类中,使用 @ExceptionHandler 注解来处理特定类型的异常:

代码语言:javascript
复制
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
        ErrorResponse errorResponse = new ErrorResponse(ex.getStatus(), ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.valueOf(ex.getStatus()));
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        ErrorResponse errorResponse = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

创建一个 ErrorResponse 类,用于封装错误响应:

代码语言:javascript
复制
public class ErrorResponse {
    private int status;
    private String message;

    public ErrorResponse(int status, String message) {
        this.status = status;
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    public String getMessage() {
        return message;
    }
}

在你的应用程序中抛出自定义异常:

代码语言:javascript
复制
@RestController
public class MyController {

    @GetMapping("/test")
    public String test() {
        throw new CustomException(400, "This is a custom exception");
    }
}

现在,当你的应用程序抛出异常时,GlobalExceptionHandler 类会捕获和处理这些异常。你可以根据异常的类型和严重程度生成一个适当的错误响应,并将其发送回用户。这有助于确保 CloudBookStore 在出现问题时始终向用户提供清晰、一致的反馈,从而提高用户体验和满意度。

Get知识点

@ControllerAdvice@ExceptionHandler 注解用于实现全局异常处理

@ControllerAdvice 注解原理

@ControllerAdvice 注解的原理是在 Spring MVC 启动时,扫描并自动注册带有此注解的类作为全局异常处理器。当 Spring MVC 检测到异常时,它会查找所有带有 @ControllerAdvice 注解的类,并调用其中的 @ExceptionHandler 方法来处理异常。

@ControllerAdvice 注解可以接受一个可选的 basePackages 属性,用于指定要扫描的包路径。如果不指定此属性,Spring MVC 将扫描所有包路径。

@ExceptionHandler 注解原理

@ExceptionHandler 注解的原理是在带有 @ControllerAdvice 注解的类中定义一个或多个方法,并使用此注解标记这些方法。当 Spring MVC 检测到异常时,它会查找所有带有 @ControllerAdvice 注解的类,并调用其中的 @ExceptionHandler 方法来处理异常。

@ExceptionHandler 注解可以接受一个或多个异常类型作为参数。当指定的异常类型被抛出时,对应的 @ExceptionHandler 方法将被调用。如果没有指定异常类型,则该方法将处理所有异常。

写在最后

异常封装处理时,可以提高代码的可读性、可维护性、可重用性、可扩展性和可测试性,但也可能增加代码的复杂性、耦合性、维护成本、测试成本等方面的问题。在实际项目中,需要根据项目的具体需求和团队的技术水平来权衡这些优缺点,以确定是否采用异常封装处理的方式。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 剧情简介
  • 场景实现
  • Get知识点
    • @ControllerAdvice 注解原理
      • @ExceptionHandler 注解原理
      • 写在最后
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档