如何在flutter中捕获异步函数的异常?

时间:2019-02-14 10:14:03

标签: exception dart flutter

我使用许多API与服务器通信,并希望处理此调用中的意外异常。但是,它根本无法捕获异常。该如何处理?

if(event is RandomChatEventMatchStart){
  yield RandomChatState.loading();
  try {
    chatRoomID = await _api.getRoomID();
    if(chatRoomID.isEmpty){
      chatRoomID = await _api.makeChatRoom();
      yield RandomChatState.madeChatRoom(chatRoomID);
    } else {
      await _api.enterChatRoom(chatRoomID);
      yield RandomChatState.matchSucceeded();
    }
  } catch(exception) {
    yield RandomChatState.apiFailed(exception.toString());
  }
}
E/flutter (12376): PlatformException(error, Invalid document reference. Document references must have an even number of segments, but messages has 1, null) E/flutter (12376): #0      StandardMethodCodec.decodeEnvelope  package:flutter/…/services/message_codecs.dart:564 E/flutter (12376):
#1      MethodChannel.invokeMethod  package:flutter/…/services/platform_channel.dart:292 E/flutter (12376): <asynchronous suspension> E/flutter (12376): #2      DocumentReference.snapshots.<anonymous closure>  ..\…\src\document_reference.dart:126 E/flutter (12376): #3     
_runGuarded (dart:async/stream_controller.dart:805:24) E/flutter (12376): #4      _BroadcastStreamController._subscribe (dart:async/broadcast_stream_controller.dart:213:7) E/flutter (12376):
#5      _ControllerStream._createSubscription (dart:async/stream_controller.dart:818:19) E/flutter (12376): #6     
_StreamImpl.listen (dart:async/stream_impl.dart:472:9) E/flutter (12376): #7      _StreamBuilderBaseState._subscribe  package:flutter/…/widgets/async.dart:135 E/flutter (12376): #8     
_StreamBuilderBaseState.didUpdateWidget  package:flutter/…/widgets/async.dart:120 E/flutter (12376): #9      StatefulElement.update  package:flutter/…/widgets/framework.dart:3863 E/flutter (12376): #10     Element.updateChild

1 个答案:

答案 0 :(得分:0)

如果您使用 Future 等异步方法,则可以使用 catchError 来处理此 guide 中提到的异常。

这是您可以在 dartpad 上运行的示例

void main() {
  foo()
      .whenComplete(() => print('Completed'))
      .catchError((error) => print('Error $error'));
}

Future<void> foo() async {
  for (int i = 0; i < 5; i++) {
    if(i==4) throw Exception;
    print('hello ${i + 1}');
  }
}