我在我的应用程序中使用Firestore,但我不知道如何在用户级别处理由此引发的异常。 (我的意思是发生此类异常时向用户显示的内容。)
例如,要在Firestore(DocumentReference#get
,DocumentReference#set
,DocumentReference#update
)上执行任何CRUD
操作,将返回Task
,其中可能包含异常,但是在文档中我找不到为什么,Firestore可能会抛出此异常。
除了简单地记录异常并显示诸如“发生错误,请稍后再试”之类的通用消息外,我们还有其他更好的方法吗?
答案 0 :(得分:1)
您可以使用Firestore的onFailureListener()方法,并在获取,设置或更新数据时获取错误。在此示例中,我将其用于设置数据:-
firestore.collection("User").document(uid).set(user).addOnSuccessListener(this, new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid)
{
//Data Saved Successfully
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(Exception e)
{
//Toast error using method -> e.getMessage()
}
});
如果您想在Firebase身份验证模块中捕获异常,请参考:-How to catch a Firebase Auth specific exceptions
答案 1 :(得分:1)
与有关getting data的官方文档一样,您可以像这样从task
对象获取异常:
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
} else {
Log.d(TAG, "No such document");
}
} else {
//Log the error if the task is not successful
Log.d(TAG, "get failed with ", task.getException());
}
}
});
请记住,任务所代表的工作完成时,任务为complete
,而不管任务success
或failure
为何。可能有也可能没有错误,您必须检查一下。从另一方面来说,当任务所代表的工作按预期完成且没有错误时,任务将“成功”。
正如@Raj在他的回答中提到的,您也可以使用addOnFailureListener
,但是请注意,如果网络连接丢失(用户设备上没有网络连接),则onSuccess()
和{ {1}}被触发。这种行为是有道理的,因为只有在Firebase服务器上已提交(或拒绝)数据后,才认为任务已完成。 onFailure()
方法也仅在任务完成时被调用。因此,如果没有互联网连接,则不会触发onComplete(Task<T> task)
。