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

