Dart Future中的内部异常未被捕获

时间:2018-12-09 04:37:22

标签: dart

我是使用Flutter 1.0和Dart 2.0的新手,对于Futures中的错误处理,我有些不了解(已经读过futures error handling)。

此代码无法捕获,并且从堆栈内部抛出异常:

_userRepository.loginWithEmailAndPassword(email, password)
.then((user) {
  print(user.id);
  print(user.toString());
}).catchError((err) {
  print(err.toString());
});

在_userRepository内部:

@override
  Future<UserEntity> loginWithEmailAndPassword(String email, String password) {
    return new Future(() {
      return auth.signInWithEmailAndPassword(email: email, password: password)
      .then((user) {
        return UserEntity(
          user.uid,
          user.displayName,
          user.email,
          emailVerified: user.isEmailVerified,
          isAnonymous: user.isAnonymous,
          phoneNumber: user.phoneNumber,
          photoUrl: user.photoUrl,
          created: user.metadata.creationTimestamp,
          lastSignIn: user.metadata.lastSignInTimestamp
        );
      });
   });
  }

auth是FirebaseAuth软件包。 signInWithEmailAndPassword返回Future<FirebaseUser>。该呼叫正常工作。在我的测试中,密码为空,并且FirebaseAuth向dart / flutter返回错误:“给出的字符串为空或null”。 Flutter在此行从message_codecs.dart抛出错误:

throw PlatformException(code: errorCode, message: errorMessage, details: errorDetails);

所有这些都按预期工作,但是我不明白为什么.catchError不能捕获异常。 loginWithEmailAndPassword将代码块包装在new Future()中。我也尝试过new Future.sync(),并尝试不包装代码块,而只返回return auth.signInWithEmailAndPassword.then(...);

从我的阅读中,我猜测问题是Flutter服务代码中的Platform Exception是同步的。但是我也认为将其包装在Future.sync()中可以解决此问题。我猜我可以将其包装在try / catch中,然后等待auth.signIn ...调用,但是我认为Futures API可以正常工作,并允许异常冒泡到我想处理的.catchError上。它。

0 个答案:

没有答案