Ошибка: [ОШИБКА:flutter/lib/ui/ui_dart_state.cc(199)] Необработанное исключение: Экземпляр «Пользовательского исключения»

# #firebase #flutter #exception #throw

Вопрос:

Я пытаюсь выполнить мобильную аутентификацию с помощью firebase auth. В процессе регистрации перед выполнением регистрации я проверяю, существует ли уже номер мобильного телефона, если он существует, я создаю пользовательское исключение.

код

 class CustomException implements Exception {
  String cause;
  CustomException(this.cause);
}

Future mobileAuth(
      String number, BuildContext context, Customer newCustomer) async {
    try {
      _databaseService
          .customerStream(customer: newCustomer)
          .listen((event) async {

        //Throwing custom exception if user exists
        if (event.length > 0) {
          throw CustomException("got error user");
        }

        await _firebaseAuth.verifyPhoneNumber(
          phoneNumber: number,
          verificationCompleted: (PhoneAuthCredential credential) async {
            await FirebaseAuth.instance
                .signInWithCredential(credential)
                .then((value) async {
              if (value.user != null) {
                Navigator.of(context).pushReplacement(MaterialPageRoute(
                    builder: (context) => HomeScreen(index: 3)));
              }
            });
          },
          verificationFailed: (FirebaseAuthException e) {
            if (e.code == 'invalid-phone-number') {
              print('The provided phone number is not valid.');
            }

            Navigator.of(context)
                .push(MaterialPageRoute(builder: (context) => MobileError()));
          },
          codeSent: (String verificationId, int? resendToken) {
            Navigator.of(context).push(MaterialPageRoute(
                builder: (context) => SignupForm3(
                      phoneNumber: number,
                      verificationCode: verificationId,
                      newCustomer: newCustomer,
                    )));

            
          },
          codeAutoRetrievalTimeout: (String verificationId) {
          },
        );
      });
      return true;
    } on CustomException catch (e) {
      print("User already exists ");
      print(e.cause);
      return false;
    } on FirebaseAuthException catch (e) {
      return false;
    } on PlatformException catch (e) {
      print(e.message);
      return false;
    } catch (e) {
      print(e.toString());
      Navigator.of(context)
          .push(MaterialPageRoute(builder: (context) => MobileError2()));
      return false;
    }
  }
 

Я получаю эту необработанную ошибку исключения. Но я реализовал уловку для обработки этого пользовательского исключения.

[ОШИБКА:flutter/lib/ui/ui_dart_state.cc(199)] Необработанное исключение: Экземпляр «CustomException»

Ответ №1:

Исключением является то, что слушатель не попадает в ловушку. Поэтому вам нужно добавить a try-catch в обратный вызов прослушивателя:

 _databaseService
          .customerStream(customer: newCustomer)
          .listen((event) async {
          
            try {
              //Listener code
            } on CustomException catch (e) {
              //Handle CustomException
            } catch (e) {
              //Handle other Exceptions
            }
          }
 

Ответ №2:

Я думаю, что ваша проверка if передает false, следовательно, ваше исключение никогда не будет вызвано.

Очень вероятно, что продолжительность события всегда больше 0, поэтому ваша проверка if всегда будет проходить.

Но вы могли бы проверить документацию, чтобы узнать, есть ли у них реализация для проверки чего-то подобного.