gpt4 book ai didi

java - 在 RxJava2 中捕获错误并返回新类型

转载 作者:行者123 更新时间:2023-12-02 11:06:53 24 4
gpt4 key购买 nike

我有一个流:

val symbols: Single<List<Symbol>>

现在我想使用 map() 将流转换为 UI 状态:

private fun cool(): Single<SymbolContract.State> =
symbols.map { SymbolContract.State.Symbols(it) }

我想要做的是捕获上游的错误 symbols single,这样我就可以捕获任何错误,然后返回 SymbolContract.State.GeneralError() .

我想要类似 onErrorMap() 的东西或者其他的东西。不幸的是,把onErrorResumeItemsymbols不起作用,因为它需要返回 List<Symbol> .

我可以想到一些丑陋的方法来做到这一点,但什么是最干净的?

最佳答案

我建议您使用全局处理错误。我给你一个样本,这样你就能明白这个想法。 (它是 kotlin)并且您可以捕获任意数量的异常,其中一些是我的自定义异常。请记住,这个示例是关于 Reactive Webflux 的,但您已经明白了。其他人也有类似的情况

@Configuration
class ExceptionTranslator {

@Bean
@Order(-1)
fun handle(objectMapper: ObjectMapper): ErrorWebExceptionHandler {
return ErrorWebExceptionHandler { exchange, ex ->
if (exchange.response.isCommitted) {
return@ErrorWebExceptionHandler Mono.error(ex)
}

val response = exchange.response
response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR
response.headers.contentType = MediaType.APPLICATION_PROBLEM_JSON_UTF8

val url: String

var message = ex.message
var params = mutableMapOf<String, Any>()

when (ex) {
is ParametricException -> {
url = ex.url
params = ex.params
}
is BaseException -> {
url = ex.url
}
is BadCredentialsException -> {
url = INVALID_CREDENTIAL_TYPE
message = ex.message ?: "Wrong Credentials"
}
is ConcurrencyFailureException -> {
url = INTERNAL_TYPE
message = ERR_CONCURRENCY_FAILURE
}
is MethodArgumentNotValidException -> {
val result = ex.bindingResult
val fieldErrors = result.fieldErrors.map {
FieldErrorVM(it.objectName, it.field, it.code ?: "Unknown")
}

url = CONSTRAINT_VIOLATION_TYPE
message = ERR_VALIDATION
params = Collections.singletonMap("errors", fieldErrors)
}
else -> url = INTERNAL_TYPE
}

if (ex is BaseException) {
response.statusCode = HttpStatus.valueOf(ex.status.code())
}

val bytes = objectMapper.writeValueAsBytes(ProblemVM(url, message ?: "Internal Error", params))
val buffer = response.bufferFactory().wrap(bytes)
response.writeWith(Mono.just(buffer))
}
}

}

关于java - 在 RxJava2 中捕获错误并返回新类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50892617/

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