我在下面的通用模块中编写了通用代码,并在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?")
}
但是我的代码以没有网络的corutineException取消在client.post结束。如何处理此异常和其他任何异常?如果有互联网连接。没有失败,我希望能够处理异常。怎么样?
注意:尝试,捕获不起作用
答案 0 :(得分:1)
对当前答案没有增加太多,但为了响应 CVS 的评论,我一直在使用以下内容在我的应用程序中添加 ktor 客户端错误处理。它使用 Result API。 runCatching {}
捕获所有 Throwable
,您可以调整 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
}
}
)
我敢肯定它可以做得更整洁,但这是我目前想到的最好的。
答案 1 :(得分:0)
好了,在这里和那里问完之后,我得到了github issues的帮助,来到了这个工作领域
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)
希望这会有所帮助