Android中Firebase Firestore错误异常识别及枚举存储实现求助
解决方案:封装Firebase错误枚举与辅助函数
1. 定义错误枚举类
先创建统一的错误枚举,把业务错误和Firebase请求错误归类管理:
public enum FirebaseError { MEMBER_NOT_FOUND, // 业务:成员不存在 NETWORK_ERROR, // 网络异常 PERMISSION_DENIED, // 权限不足 INVALID_DOCUMENT_ID, // 无效文档ID UNKNOWN_ERROR // 未知错误 }
2. 编写错误解析辅助函数
新建工具类FirebaseErrorUtils,实现异常到枚举的转换逻辑:
public class FirebaseErrorUtils { public static FirebaseError parseFirebaseException(Exception e) { // 处理Firestore专属异常 if (e instanceof FirebaseFirestoreException) { FirebaseFirestoreException firestoreEx = (FirebaseFirestoreException) e; switch (firestoreEx.getCode()) { case PERMISSION_DENIED: return FirebaseError.PERMISSION_DENIED; case NOT_FOUND: return FirebaseError.INVALID_DOCUMENT_ID; case UNAVAILABLE: return FirebaseError.NETWORK_ERROR; default: return FirebaseError.UNKNOWN_ERROR; } } // 处理网络IO异常 else if (e instanceof IOException) { return FirebaseError.NETWORK_ERROR; } // 其他未覆盖的异常 else { return FirebaseError.UNKNOWN_ERROR; } } }
3. 完善DataListener接口
给你的DataListener新增错误回调方法,用于传递解析后的错误枚举:
public interface DataListener<T> { void onDataReady(T data); void onDataNotFound(FirebaseError error); void onError(FirebaseError error); // 新增错误回调 }
4. 改造原getMember方法
更新原方法,在失败回调里调用辅助函数解析错误,并通知监听者:
public static void getMember(String id, DataListener<Member> listener){ FirebaseAgent.getMemberDocumentReference(id).get() .addOnSuccessListener(documentSnapshot -> { if (documentSnapshot.exists()) { listener.onDataReady(documentSnapshot.toObject(Member.class)); } else { listener.onDataNotFound(FirebaseError.MEMBER_NOT_FOUND); } }) .addOnFailureListener(e -> { FirebaseError error = FirebaseErrorUtils.parseFirebaseException(e); listener.onError(error); }); }
补充说明
- 你可以根据业务需求扩展
FirebaseError枚举,比如添加INVALID_ARGUMENT、ABORTED等Firestore官方错误码对应的枚举项 - 辅助函数里的异常判断逻辑可以进一步细化,覆盖更多Firebase可能抛出的异常类型
- 业务错误(如
MEMBER_NOT_FOUND)和请求错误分开处理,能让调用方更清晰地区分不同错误场景
内容的提问来源于stack exchange,提问作者Mouad Oumous
相关产品推荐
相关产品推荐

