Flutter 无法使用 tryCatch 捕获异常

时间:2021-05-29 15:59:08

标签: flutter dart try-catch

我无法捕获异常。有人知道怎么抓吗?

这是抛出错误的地方。我只是用 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)

2 个答案:

答案 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,如果我错了,请告诉我。