我无法捕获异常。有人知道怎么抓吗?
这是抛出错误的地方。我只是用 try-catch 块包裹它,但它对我没有帮助,它无法捕获它,我不知道它是什么无法捕获
此方法来自我的自定义 BaseDB 抽象类,并且此方法在我的自定义 FirebaseDBService 类上被覆盖。
@override
Stream<Oyuncu> oyuncuStream(String UID) {
try {
return usersColRef
.doc(UID)
.withConverter<Oyuncu>(
fromFirestore: (snapshot, _) => Oyuncu.fromJson(snapshot.data()!),
toFirestore: (Oyuncu model, _) => model.toJson(),
)
.snapshots()
.map((event) {
// if (event.data() is Map<String, dynamic>) {
// var jsonDoc = event.data() as Map<String, dynamic>;
// return Oyuncu.fromJson(jsonDoc);
if(event.data() is Oyuncu) {
return event.data() as Oyuncu;
}else{
throw Exception('Unable get user from DB');
}
});
} on Exception catch (e) {
print("Test "+e.toString());
rethrow;
}
}
我的调试控制台:
W/ProviderInstaller(16484): Failed to load providerinstaller module: No acceptable module found. Local version is 0 and remote version is 0.
E/flutter (16484): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: Exception: Unable get user from DB
E/flutter (16484): #0 FirestoreDBService.oyuncuStream.<anonymous closure> (package:p763_quiz/data/service/db/firestoreDBService.dart:41:11)
E/flutter (16484): #1 _MapStream._handleData (dart:async/stream_pipe.dart:213:31)
E/flutter (16484): #2 _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:153:13)
E/flutter (16484): #3 _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter (16484): #4 _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (16484): #5 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1170:7)
E/flutter (16484): #6 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
E/flutter (16484): #7 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
E/flutter (16484): #8 _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:123:11)
E/flutter (16484): #9 _MapStream._handleData (dart:async/stream_pipe.dart:218:10)
E/flutter (16484): #10 _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:153:13)
E/flutter (16484): #11 _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter (16484): #12 _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (16484): #13 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1170:7)
E/flutter (16484): #14 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
E/flutter (16484): #15 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
E/flutter (16484): #16 _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:123:11)
E/flutter (16484): #17 _MapStream._handleData (dart:async/stream_pipe.dart:218:10)
E/flutter (16484): #18 _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:153:13)
E/flutter (16484): #19 _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter (16484): #20 _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (16484): #21 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1170:7)
E/flutter (16484): #22 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
E/flutter (16484): #23 _DelayedData.perform (dart:async/stream_impl.dart:591:14)
E/flutter (16484): #24 _StreamImplEvents.handleNext (dart:async/stream_impl.dart:706:11)
E/flutter (16484): #25 _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:663:7)
E/flutter (16484): #26 _rootRun (dart:async/zone.dart:1346:47)
E/flutter (16484): #27 _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter (16484): #28 _CustomZone.runGuarded (dart:async/zone.dart:1162:7)
E/flutter (16484): #29 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1202:23)
E/flutter (16484): #30 _rootRun (dart:async/zone.dart:1354:13)
E/flutter (16484): #31 _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter (16484): #32 _CustomZone.runGuarded (dart:async/zone.dart:1162:7)
E/flutter (16484): #33 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1202:23)
E/flutter (16484): #34 _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
E/flutter (16484): #35 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
E/flutter (16484):
W/IInputConnectionWrapper(16484): getExtractedText on inactive InputConnection
W/IInputConnectionWrapper(16484): getTextBeforeCursor on inactive InputConnection
W/oidim.p763_qui(16484): Accessing hidden method Ldalvik/system/CloseGuard;->warnIfOpen()V (greylist,core-platform-api, linking, allowed)
答案 0 :(得分:1)
问题可能出在关键字“rethrow”上。因为如果加上这个关键字,就会把oyuncuStream捕捉到的异常发送到调用oyuncuStream的函数中。 --> oyuncuStream 也应该在调用它的地方用 try-cat 包裹起来。
答案 1 :(得分:0)
使用 onError 选项成功处理了错误。
@override
Stream<Oyuncu> oyuncuStream(String UID) {
return usersColRef
.doc(UID)
.withConverter<Oyuncu>(
fromFirestore: (snapshot, _) => Oyuncu.fromJson(snapshot.data()!),
toFirestore: (Oyuncu model, _) => model.toJson(),
)
.snapshots()
.map((event) => event.data() as Oyuncu).handleError((x){
throw 'There is a problem with your account';
});
}
我可以从来电者那里得到。
void startListeningOyuncu(String id) {
oyuncuDBSubs = db.oyuncuStream(id).listen((oyuncu) {
emit(AuthState.auhtenticated(oyuncu));
})
..onError((x) {
toastBase.toastService.showToast(text: x.toString());
add(AuthEvent.logOut());
});
}
我认为我们不能在 Streams 中使用 try-catch,如果我错了,请告诉我。