簡體   English   中英

建模異常和處理服務器應用程序中的 http 代碼

[英]Modelling exceptions & Handling http codes inside a server application

我正在開發一個 spring 啟動應用程序,它使 http 調用多個外部服務,聚合並將響應返回到前端。

這是我項目的當前結構:

RouteController -> Handler -> ServiceLayer
  • RouteController 路由到不同的處理程序
  • Handler 調用多個服務,執行聚合並返回響應。
  • 每個服務調用都有不同的 ServiceLayers。
  • 處理程序可以返回部分響應,如果一個服務調用失敗,它將返回其他調用的響應。
  • 我沒有添加類/控制器級別的異常處理程序,因為也可以返回部分響應。

注意- 此應用程序將始終發送 Http 200 響應,除非所有服務調用都失敗。
Spring異常處理我在這里尋找的是應用程序內部的異常處理。

我正在嘗試在此服務中添加異常處理,並且似乎沒有明確簡潔的規則。

這是我為任何依賴失敗創建的自定義異常 -

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 異常傳播到處理程序/控制器層?
  • 上面的依賴異常的scope是不是太大了?
  • 4xx,5xx 錯誤代碼是否應該轉換為不同的自定義異常以進行內部處理? (以及每個系列中不同代碼的不同處理?)
  • 您建議在此項目中處理異常的最佳方法是什么?

您好,您的問題:

  1. 服務何時應該編寫自己的異常? -->

這取決於您的業務邏輯,例如您有一個服務層來更新用戶,您應該通過 ID 找到它,如果找不到用戶,您應該拋出異常

  1. 何時使用 kotlin/java 標准庫現有異常?

如果您使用 spring-boot 是一個框架,為您提供現成的庫和 APIS 來處理所有您可以查看此鏈接https://www.baeldung.com/exception-handling-for-rest-with-spring

  1. 您是否應該將 spring Http 異常傳播到處理程序/控制器層?

是的; 因為controller負責處理Http的異常,業務層的service

  1. 上面的依賴異常的scope是不是太大了?

我沒看懂這個問題

  1. 4xx,5xx 錯誤代碼是否應該轉換為不同的自定義異常類型? (以及每個系列中不同代碼的不同處理?)

不需要,建議返回 Http 錯誤代碼和自定義消息,以便客戶端了解異常錯誤原因

  1. 您建議在此項目中處理異常的最佳方法是什么?

我推薦遵循 jhiptser spring 引導項目結構, https://www.jhipster.tech/managing-server-errors/

  1. 服務何時應該編寫自己的異常? 每當標准庫中的現有異常不涵蓋您的用例時,或者當您想在異常中添加更多詳細信息時。

  2. 何時使用 kotlin/java 標准庫現有異常? 同上,不要試圖重新發明輪子。 比如,使用 IllegalArgumentException 而不是創建您自己的 InvalidRequestException。 看看這里 - https://programming.guide/java/list-of-java-exceptions.html

  3. 您是否應該將 spring Http 異常傳播到處理程序/控制器層? 我建議不要將任何外部框架的異常傳播到您的 controller。 相反,編寫您自己的異常,並盡可能多地使用 Java.lang 中的現有異常。 Http 異常應該保留在它們的預期位置,即請求/響應層。
  4. 上面的依賴異常的scope是不是太大了? 這里的依賴異常太寬泛了,如果您的應用程序必須以不同的方式處理不同的 Http 代碼怎么辦。 您將如何處理該問題?
  5. 4xx,5xx 錯誤代碼是否應該轉換為不同的自定義異常類型? (以及每個系列中不同代碼的不同處理方式?)很大程度上取決於客戶的需求。 正如您所提到的,在您的情況下,您正在編排層處理它們並抑制它們。 您是否認為這種實現在未來會發生變化,以及變化多遠? 我建議的第一步是至少 map 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 錯誤返回良好做法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM