如何为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
相关产品推荐
相关产品推荐

