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

如何从Firestore Task获取响应码并处理Tasks中的异常类型

Firestore Task 错误处理:获取响应码与异常过滤

1. 如何从Firestore Task中获取响应码?

Firestore的Task本身不会直接返回HTTP响应码,但你可以通过失败时抛出的FirebaseFirestoreException获取标准化的错误码(Firebase定义的枚举类型,与HTTP状态码一一对应)。

当task.isSuccessful()为false时,先把task.getException()强转为FirebaseFirestoreException,再调用getCode()方法就能拿到具体的错误类型枚举。

2. com.google.android.gms.tasks中的Exception类型及过滤方式

在Firestore操作场景中,最核心的异常类型是FirebaseFirestoreException——所有服务端返回的业务错误都会封装在这个类里。除此之外,可能还会遇到通用RuntimeException(比如客户端空指针、网络连接异常等),但业务相关的错误基本都由FirebaseFirestoreException覆盖。

FirebaseFirestoreException.Code枚举定义了所有可能的错误类型,常用的包括:

  • PERMISSION_DENIED:权限不足(对应HTTP 403)
  • QUOTA_EXCEEDED:超出配额(对应HTTP 429)
  • NOT_FOUND:目标资源不存在(对应HTTP 404)
  • INVALID_ARGUMENT:请求参数无效(对应HTTP 400)
  • UNAVAILABLE:服务暂时不可用(对应HTTP 503)

过滤异常时,先通过instanceof判断异常类型,再针对FirebaseFirestoreException的Code做分支处理即可。

可运行的示例代码

我把你提供的代码修改为符合Firestore规范的可运行版本:

db.collection("users")
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                QuerySnapshot snapshot = task.getResult();
                // 注意:查询无匹配文档时,task仍会标记为成功,需单独判断快照是否为空
                if (snapshot.isEmpty()) {
                    return Status.ZERO_RESULTS;
                }
                for (DocumentSnapshot document : snapshot) {
                    Log.d(TAG, document.getId() + " => " + document.getData());
                }
            } else {
                Exception exception = task.getException();
                if (exception instanceof FirebaseFirestoreException) {
                    FirebaseFirestoreException firestoreException = (FirebaseFirestoreException) exception;
                    FirebaseFirestoreException.Code errorCode = firestoreException.getCode();
                    
                    switch (errorCode) {
                        case PERMISSION_DENIED:
                            return Status.REQUEST_DENIED;
                        case QUOTA_EXCEEDED:
                            return Status.OVER_QUERY_LIMIT;
                        case INVALID_ARGUMENT:
                            return Status.INVALID_REQUEST;
                        default:
                            return null;
                    }
                } else {
                    // 处理非Firestore特定的异常,比如网络连接失败等
                    Log.e(TAG, "Unexpected error occurred", exception);
                    return null;
                }
            }
        }
    });

补充说明

你示例中的ZERO_RESULTS不需要放在异常分支处理——因为Firestore查询无匹配文档时,task.isSuccessful()仍会返回true,只是查询快照为空,所以需要在成功分支里单独判断快照是否为空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:34:16