gpt4 book ai didi

java - 在服务器应用程序中建模异常和处理 http 代码

转载 作者:行者123 更新时间:2023-12-02 12:45:13 25 4
gpt4 key购买 nike

我正在开发一个 spring boot 应用程序,它对多个外部服务进行 http 调用,聚合并将响应返回给前端。

这是我的项目的当前结构:

RouteController -> Handler -> ServiceLayer
  • RouteController 路由到不同的处理程序
  • 处理程序调用多个服务,执行聚合并返回响应。
  • 每个服务调用的不同 ServiceLayers。
  • Handler 可以返回部分响应,如果一个服务调用失败,它将返回其他调用的响应。
  • 我没有添加类/ Controller 级异常处理程序,因为也可以返回部分响应。

  • 备注 - 此应用程序将始终发送 Http 200 响应,除非所有服务调用都失败。
    Spring异常处理 https://www.baeldung.com/exception-handling-for-rest-with-spring用于类/ Controller 级别,并将 Http 响应代码传送到客户端。
    我在这里寻找的是应用程序内部的异常处理。

    我正在尝试在此服务中添加异常处理,但似乎没有明确的简洁规则。

    这是我为任何依赖项失败创建的自定义异常 -
    class DependencyException : RuntimeException {
    constructor() : super()
    constructor(message: String?) : super(message)
    constructor(cause: Exception?) : super(cause)
    constructor(message: String?, cause: Exception?) : super(message, cause)
    }

    这是调用 UserService 的服务层代码 -
    fun getUsers(): List<User>? {
    logger.info { "entered: getUsers " }
    val response = userControllerApiClient.getUsers()

    when (response.statusCode.is2xxSuccessful) {
    true -> return response.body?.users
    false -> throw DependencyException()
    }
    }

    用过 org.springframework.http http 调用的库。

    有几个问题我找不到明确的答案 -
  • 服务何时应该编写自己的异常?
  • 何时使用 kotlin/java 标准库现有异常?
  • 您是否应该将 spring http 异常传播到处理程序/ Controller 层?
  • 上面依赖异常的范围是不是太大了?
  • 是否应该将 4xx,5xx 错误代码转换为不同的自定义异常以进行内部处理? (还有每个系列对不同代码的不同处理?)
  • 您建议在此项目中处理异常的最佳方法是什么?
  • 最佳答案

  • 服务何时应该编写自己的异常?
    每当标准库中的现有异常未涵盖您的用例时,或者当您想在异常中添加更多详细信息时。
  • 何时使用 kotlin/java 标准库现有异常?
    同上,不要试图重新发明轮子。像,使用 IllegalArgumentException 而不是创建你自己的 InvalidRequestException 。看这里 - https://programming.guide/java/list-of-java-exceptions.html
  • 您是否应该将 spring Http 异常传播到处理程序/ Controller 层?
    我建议不要将任何外部框架的异常传播到您的 Controller 。相反,编写您自己的异常,并尽可能多地使用来自 Java.lang 的现有异常。 Http 异常应该保留在它们用于请求/响应层的地方。
  • 上面依赖异常的范围是不是太大了?
    这里的依赖异常太宽泛了,如果你的应用程序必须以不同的方式处理不同的Http代码怎么办。你将如何处理?
  • 4xx,5xx 错误代码是否应该转换为不同的自定义异常类型? (还有每个系列对不同代码的不同处理?)
    很大程度上取决于客户想要什么。在您提到的情况下,您是在编排层处理它们并抑制它们。您认为这种实现在 future 会发生变化吗?会发生多远?
    我建议的第一步是至少将 4xx 和 5xx 错误映射到不同的异常。仔细看看,看看你想从中重试/恢复哪些类型并从中派生另一种类型。

  • 这里有一些资源丰富的我认为你应该看看 -

    https://itnext.io/graceful-error-handling-in-rest-driven-web-applications-d4209b4937aa

    https://github.com/cloudendpoints/endpoints-java/blob/master/endpoints-framework/src/main/java/com/google/api/server/spi/ServiceException.java

    REST API error return good practices

    关于java - 在服务器应用程序中建模异常和处理 http 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61772087/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com