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

