服务器应用程序中的异常建模和处理 http 代码
Modelling exceptions & Handling http codes inside a server application
我正在开发一个 spring 引导应用程序,它对多个外部服务进行 http 调用,聚合并 returns 对前端的响应。
这是我项目的当前结构:
RouteController -> Handler -> ServiceLayer
- RouteController 路由到不同的处理程序
- 处理程序调用多个服务,执行聚合和 return 响应。
- 每个服务调用的不同服务层。
- 处理程序可以 return 部分响应,如果一个服务调用失败,它将 return 响应其他调用。
- 我没有添加 class/controller 级别的异常处理程序,因为部分响应也可以 returned。
注意 - 此应用程序将始终发送 Http 200 响应,除非所有服务调用都失败。
Spring异常处理https://www.baeldung.com/exception-handling-for-rest-with-spring是针对class/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 异常传播到 handler/controller 层?
- 上面依赖异常的范围是不是太大了?
- 是否应该将4xx、5xx错误码转换为不同的自定义异常进行内部处理? (以及每个系列中不同代码的不同处理方式?)
- 您推荐在该项目中处理异常的最佳方法是什么?
您好:
- 服务什么时候应该编写自己的异常? -->
it depends in your business logic for example you have a service layer
to update a user , you should find it by ID , if user not found you
should throw an exception
- 什么时候使用kotlin/java标准库现有异常?
if you are using spring-boot is a framework to provide for you ready
libs and APIS to handle all you can check this link
https://www.baeldung.com/exception-handling-for-rest-with-spring
- 您是否应该将 spring Http 异常传播到 handler/controller
图层 ?
Yes; because the controller is responsible for handling the Http
exceptions, the service the business layer
- 上面依赖异常的范围是不是太大了?
我没看懂这个问题
- 4xx,5xx错误代码是否应该转换为不同的自定义
异常类型? (以及对不同代码的不同处理
每个系列? )
不,没必要,建议return 带有自定义消息的 Http 错误代码,以便客户端了解异常错误原因
- 您推荐的处理异常的最佳方法是什么
项目?
我建议遵循 jhiptser spring 引导项目结构,https://www.jhipster.tech/managing-server-errors/
服务什么时候应该编写自己的异常?
当标准库中的现有异常不涵盖您的用例时,或者当您想要在异常中添加更多详细信息时。
何时使用 kotlin/java 标准库现有异常?
同上,不要重新发明轮子。比如,使用 IllegalArgumentException 而不是创建你自己的 InvalidRequestException 。看这里 - https://programming.guide/java/list-of-java-exceptions.html
- 是否应该将 spring Http 异常传播到 handler/controller 层?
我建议不要将任何外部框架的异常传播到您的控制器。相反,编写您自己的异常,并尽可能多地使用 Java.lang 中的现有异常。 Http 异常应该保留在它们应该用于 Request/Response 层的位置。
- 上面依赖异常的范围是不是太大了?
此处的依赖异常过于宽泛,如果您的应用程序必须以不同方式处理不同的 Http 代码怎么办。你将如何管理它?
- 4xx,5xx错误码是否应该转换为不同的自定义异常类型? (以及每个系列中不同代码的不同处理方式?)
很大程度上取决于客户的需求。正如您所提到的,在您的情况下,您正在编排层处理它们并抑制它们。您是否认为这种实施方式会在未来发生变化,变化幅度有多大?
我建议的第一步是至少将 4xx 和 5xx 错误映射到不同的异常。仔细看看,看看您想要从哪些 retry/recover 派生出另一种类型。
这里有一些我认为你应该看看的资源 -
https://itnext.io/graceful-error-handling-in-rest-driven-web-applications-d4209b4937aa
REST API error return good practices
我正在开发一个 spring 引导应用程序,它对多个外部服务进行 http 调用,聚合并 returns 对前端的响应。
这是我项目的当前结构:
RouteController -> Handler -> ServiceLayer
- RouteController 路由到不同的处理程序
- 处理程序调用多个服务,执行聚合和 return 响应。
- 每个服务调用的不同服务层。
- 处理程序可以 return 部分响应,如果一个服务调用失败,它将 return 响应其他调用。
- 我没有添加 class/controller 级别的异常处理程序,因为部分响应也可以 returned。
注意 - 此应用程序将始终发送 Http 200 响应,除非所有服务调用都失败。
Spring异常处理https://www.baeldung.com/exception-handling-for-rest-with-spring是针对class/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 异常传播到 handler/controller 层?
- 上面依赖异常的范围是不是太大了?
- 是否应该将4xx、5xx错误码转换为不同的自定义异常进行内部处理? (以及每个系列中不同代码的不同处理方式?)
- 您推荐在该项目中处理异常的最佳方法是什么?
您好:
- 服务什么时候应该编写自己的异常? -->
it depends in your business logic for example you have a service layer to update a user , you should find it by ID , if user not found you should throw an exception
- 什么时候使用kotlin/java标准库现有异常?
if you are using spring-boot is a framework to provide for you ready libs and APIS to handle all you can check this link https://www.baeldung.com/exception-handling-for-rest-with-spring
- 您是否应该将 spring Http 异常传播到 handler/controller 图层 ?
Yes; because the controller is responsible for handling the Http exceptions, the service the business layer
- 上面依赖异常的范围是不是太大了?
我没看懂这个问题
- 4xx,5xx错误代码是否应该转换为不同的自定义 异常类型? (以及对不同代码的不同处理 每个系列? )
不,没必要,建议return 带有自定义消息的 Http 错误代码,以便客户端了解异常错误原因
- 您推荐的处理异常的最佳方法是什么 项目?
我建议遵循 jhiptser spring 引导项目结构,https://www.jhipster.tech/managing-server-errors/
服务什么时候应该编写自己的异常? 当标准库中的现有异常不涵盖您的用例时,或者当您想要在异常中添加更多详细信息时。
何时使用 kotlin/java 标准库现有异常? 同上,不要重新发明轮子。比如,使用 IllegalArgumentException 而不是创建你自己的 InvalidRequestException 。看这里 - https://programming.guide/java/list-of-java-exceptions.html
- 是否应该将 spring Http 异常传播到 handler/controller 层? 我建议不要将任何外部框架的异常传播到您的控制器。相反,编写您自己的异常,并尽可能多地使用 Java.lang 中的现有异常。 Http 异常应该保留在它们应该用于 Request/Response 层的位置。
- 上面依赖异常的范围是不是太大了? 此处的依赖异常过于宽泛,如果您的应用程序必须以不同方式处理不同的 Http 代码怎么办。你将如何管理它?
- 4xx,5xx错误码是否应该转换为不同的自定义异常类型? (以及每个系列中不同代码的不同处理方式?) 很大程度上取决于客户的需求。正如您所提到的,在您的情况下,您正在编排层处理它们并抑制它们。您是否认为这种实施方式会在未来发生变化,变化幅度有多大? 我建议的第一步是至少将 4xx 和 5xx 错误映射到不同的异常。仔细看看,看看您想要从哪些 retry/recover 派生出另一种类型。
这里有一些我认为你应该看看的资源 -
https://itnext.io/graceful-error-handling-in-rest-driven-web-applications-d4209b4937aa
REST API error return good practices