Оператор Catch не перехватывает выданную ошибку в режиме отладки в асинхронной функции - PullRequest
0 голосов
/ 26 февраля 2019

Я не знаю, почему оператор catch не перехватывает сгенерированную ошибку при отладке приложения.
Это основная функция:

void main() async {
  final initialState = await persistor.load();
  bool logged = false;

  if (initialState.isLoggedIn) {
    logged = await initialState.silentlyLogin(); // <---- FUNCTION THAT THROWS ERROR
  }
  if (!logged) {
    initialState.logout();
  }
}

Это функция silentlyLogin моего класса State.:

Future<bool> silentlyLogin() async {
    try {
      await globals.googleSignIn.signInSilently();
      return true;
    } catch (e) {
      return false;
    }
}

При отладке функция googleSignIn.signInSilently выдавала ошибку, в этой части кода:

@override
  dynamic decodeEnvelope(ByteData envelope) {
    // First byte is zero in success case, and non-zero otherwise.
    if (envelope.lengthInBytes == 0)
      throw const FormatException('Expected envelope, got nothing');
    final ReadBuffer buffer = ReadBuffer(envelope);
    if (buffer.getUint8() == 0)
      return messageCodec.readValue(buffer);
    final dynamic errorCode = messageCodec.readValue(buffer);
    final dynamic errorMessage = messageCodec.readValue(buffer);
    final dynamic errorDetails = messageCodec.readValue(buffer);
    if (errorCode is String && (errorMessage == null || errorMessage is String) && !buffer.hasRemaining)
      throw PlatformException(code: errorCode, message: errorMessage, details: errorDetails); // <------ HERE IS THE ERROR
    else
      throw const FormatException('Invalid envelope');
  }

В режиме отладки android studio блокирует приложение в throw PlatformException line, но мой оператор catch никогда не перехватывается, поэтому моя функция всегда возвращает true.Пока мое выражение catch никогда не перехватывается.

1 Ответ

0 голосов
/ 27 февраля 2019

Исключение, вероятно, генерируется в собственном коде и вообще не передается Dart.Дарт не может поймать исключения Java или ObjectivC / Swift.Плагин должен был поймать его на Java, отправить сообщение Dart, а в Dart - искусственное исключение.

См. Также

...