【发布时间】:2020-08-29 11:54:12
【问题描述】:
我正在开发一个 spring boot 应用程序,它对多个外部服务进行 http 调用,聚合并将响应返回给前端。
这是我项目的当前结构:
RouteController -> Handler -> ServiceLayer
- RouteController 路由到不同的处理程序
- Handler 调用多个服务,执行聚合并返回响应。
- 每个服务调用都有不同的 ServiceLayers。
- 处理程序可以返回部分响应,如果一个服务调用失败,它将返回其他调用的响应。
- 我没有添加类/控制器级别的异常处理程序,因为也可以返回部分响应。
注意 - 此应用程序将始终发送 Http 200 响应,除非所有服务调用均失败。
Spring 异常处理https://www.baeldung.com/exception-handling-for-rest-with-spring 用于类/控制器级别,并将 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 异常传播到处理程序/控制器层?
- 上面的依赖异常范围是不是太大了?
- 是否应该将 4xx、5xx 错误代码转换为不同的自定义异常以进行内部处理? (还有每个系列对不同代码的不同处理?)
- 您建议在此项目中处理异常的最佳方法是什么?
【问题讨论】:
-
Spring 有一个 @ExceptionHandler 用于全局/控制器级别的异常处理,这是我不想要的,因为我们会在那里丢失部分响应。
标签: java spring-boot kotlin exception exceptionhandler