3

我在下面的通用模块中编写了通用代码并在JS环境中进行了测试

val response = client.post<HttpResponse>(url) {
    body = TextContent("""{"a":1,"b":2}""", ContentType.Application.Json)
}
if (response.status != HttpStatusCode.OK) {
    logger.error("Error, this one failed bad?")
}

但是我的代码以 client.post 结尾,并在没有网络上取消了 corutineException。我该如何处理这个和任何其他异常?如果有互联网连接。没有什么失败,我希望能够处理异常。如何?

注意:try,catch 不起作用

4

2 回答 2

7

对当前答案没有增加太多,但为了响应 CVS 的评论,我一直在使用以下内容在我的应用程序中添加 ktor 客户端错误处理。它使用了Result API。runCatching {}捕获所有Throwables,您可以调整getOrElse块的行为以捕获您感兴趣的异常。

suspend fun <T> HttpClient.requestAndCatch(
    block: suspend HttpClient.() -> T,
    errorHandler: suspend ResponseException.() -> T
): T = runCatching { block() }
    .getOrElse {
        when (it) {
            is ResponseException -> it.errorHandler()
            else -> throw it
        }
    }

// Example call
client.requestAndCatch(
    { get<String>("/") },
    {
        when (response.status) {
            HttpStatusCode.BadRequest -> {} // Throw errors or transform to T 
            HttpStatusCode.Conflict -> {}
            else -> throw this
        }
    }
)

我相信它可以变得更整洁,但这是我迄今为止想出的最好的。

于 2021-01-05T12:54:35.310 回答
4

在这里和那里询问之后,我从github 问题中得到了帮助并来到了这个工作

try {
    val response = client.post<HttpResponse>(url) {
        body = TextContent("""{"a":1,"b":2}""", ContentType.Application.Json)
    }
    if (response.status != HttpStatusCode.OK) {
        logger.error("Error, this one failed bad?")
    }
} catch (cause: Throwable) {
    logger.error("Catch your error here")
}

不要catch (c: Throwable)混淆catch (e: Exception)

希望这可以帮助

于 2019-02-14T07:24:15.733 回答