处理 HttpClient Ktor 中的异常

Posted

技术标签:

【中文标题】处理 HttpClient Ktor 中的异常【英文标题】:Handling Exception in HttpClient Ktor 【发布时间】:2019-07-07 20:12:07 【问题描述】:

我在下面的一个通用模块中编写了一个通用代码并在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 不起作用

【问题讨论】:

【参考方案1】:

目前的答案并没有增加太多,但为了回应 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
        
    
)

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

【讨论】:

【参考方案2】:

好在到处问了之后,我得到了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) 混淆

希望对你有帮助

【讨论】:

包装这个 try-catch 块的惯用方式是什么?也许某种内联函数? 您如何区分网络故障(您可以向用户显示但否则忽略)与指示某些内容已损坏的错误(例如使用 KotlinxSerializer 响应时的反序列化错误)和应该发送到崩溃报告工具?

以上是关于处理 HttpClient Ktor 中的异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ktor HttpClient(CIO) websocket 发送内容时如何捕获 Broken pipe 异常?

Ktor 的 HttpClient 使用的正确模式

Ktor HttpClient 在 runBlocking 中挂起

如何在 Multiplatform Ktor 和 Coil 之间共享 HttpClient?

如何使用针对 linuxX64 的 ktor-client-core 修复“未解决的参考:HttpClient”

在 Kotlin 多平台项目中使用 Ktor HttpClient 将文件作为二进制文件