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

Android中Apollo GraphQL客户端ApolloHttpException异常处理问题

正确处理Android Apollo GraphQL客户端的403异常

你的代码目前捕获ApolloHttpException后直接重新抛出,等于没有做任何有效处理,异常依然会向上传递导致应用崩溃。结合403状态码代表请求权限不足的含义,你可以按照以下方式优化异常处理:

1. 封装结果状态(推荐)

使用密封类封装请求的成功/失败状态,让调用方可以安全处理不同情况,避免崩溃:

// 定义通用结果密封类
sealed class ApiResult<out T> {
    data class Success<out T>(val data: T) : ApiResult<T>()
    data class Failed(val message: String, val exception: Exception? = null) : ApiResult<Nothing>()
}

suspend fun getResult(): ApiResult<ApolloResponse<StudentQuery.Data>> {
    return try {
        val response = apolloClient.query(GetStudentQuery()).execute()
        
        // 额外处理GraphQL层面的业务错误
        if (response.hasErrors()) {
            val errorMsg = response.errors?.joinToString(separator = "\n") { it.message ?: "未知错误" }
            ApiResult.Failed(errorMsg ?: "请求失败")
        } else {
            ApiResult.Success(response)
        }
    } catch (exception: ApolloHttpException) {
        when (exception.statusCode) {
            403 -> {
                // 针对403权限错误的处理:比如提示用户重新登录、触发Token刷新
                ApiResult.Failed("权限不足,请重新登录", exception)
            }
            // 可扩展处理其他HTTP状态码,比如404、500等
            else -> ApiResult.Failed("请求失败:${exception.statusCode}", exception)
        }
    } catch (exception: Exception) {
        // 捕获其他未知异常
        ApiResult.Failed("未知错误", exception)
    }
}

2. 调用方处理示例

在ViewModel或UI层调用时,根据返回的ApiResult状态做对应处理:

viewModelScope.launch {
    when (val result = getResult()) {
        is ApiResult.Success -> {
            // 处理成功数据
            val studentData = result.data.data?.student
        }
        is ApiResult.Failed -> {
            // 显示错误提示
            Toast.makeText(context, result.message, Toast.LENGTH_SHORT).show()
        }
    }
}

关键说明

  • 避免直接抛出捕获到的异常,而是将异常转化为可处理的状态,让上层决定如何展示或恢复。
  • 403状态码通常需要结合业务逻辑处理:比如检查Token是否过期、用户权限是否足够,必要时触发Token刷新流程。
  • 不要忽略GraphQL自身的错误(通过response.hasErrors()判断),这类错误是服务端返回的业务错误,不属于HTTP异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:43