You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Ktor API调用编写统一的异常处理公共函数?

Ktor 统一异常处理方案

你可以通过高阶函数将重复的异常处理逻辑封装成公共工具函数,让所有API调用复用同一套逻辑,避免重复编写catch代码。

1. 定义统一异常处理函数

创建一个suspend类型的高阶函数,包裹API调用逻辑并集中处理各类异常:

import io.ktor.client.plugins.ClientRequestException
import io.ktor.client.plugins.HttpRequestTimeoutException
import io.ktor.http.HttpStatusCode
import java.io.IOException
import android.util.Log

private const val TAG = "ApiExceptionHandler"

suspend fun <T> safeApiCall(
    apiCall: suspend () -> T,
    onSuccess: (T) -> Unit,
    onUnauthorized: () -> Unit = {},
    onApiError: () -> Unit = {},
    onTimeout: () -> Unit = {},
    onNetworkError: () -> Unit = {},
    onGeneralError: (Exception) -> Unit = {}
) {
    try {
        val result = apiCall()
        onSuccess(result)
    } catch (cause: HttpRequestTimeoutException) {
        Log.d(TAG, "ConnectTimeoutException failure: $cause")
        onTimeout()
    } catch (cause: IOException) {
        Log.d(TAG, "IOException failure: $cause")
        onNetworkError()
    } catch (clientException: ClientRequestException) {
        val exceptionResponse = clientException.response
        if (exceptionResponse.status == HttpStatusCode.Unauthorized) {
            onUnauthorized()
        } else {
            Log.d(TAG, "Api Error: ${clientException.message}")
            onApiError()
        }
    } catch (cause: Exception) {
        Log.d(TAG, "General Exception failure: $cause")
        onGeneralError(cause)
    }
}

2. 简化API调用代码

用这个公共函数替代原来的try-catch块,调用方式如下:

safeApiCall(
    apiCall = {
        client.get(API) {
            header("Authorization", token)
        }.body<ModelClass>()
    },
    onSuccess = { modelResponse ->
        response(modelResponse)
    },
    onUnauthorized = {
        // 处理未授权逻辑
    },
    onApiError = {
        // 处理其他客户端错误
    }
    // 不需要的回调可直接省略,比如超时、网络错误等
)

说明

  • 高阶函数将API调用逻辑作为参数传入,同时提供可选回调,让你能针对不同异常场景自定义处理逻辑。
  • 所有异常的日志打印已集中在公共函数内,无需在每个API调用中重复编写。
  • 若某些异常场景不需要自定义处理,直接省略对应参数即可,函数会使用默认空实现。

内容的提问来源于stack exchange,提问作者arun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:10:06