exception - 如何在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
解决方案
如果您使用异步方法,如本指南Future
中所述,您可以使用catchError
来处理异常。
这是您可以在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}');
}
}
推荐阅读
- java - Mongo Java Driver 4+ 构造函数问题
- java - 使用 XMLEventReader 读取部分 XML 文件时,如何配置结果的封闭标签?
- php - CSS 样式不适用于 .htaccess 重定向
- java - 处理多个 http 响应并以单一方法一次返回它们
- react-native - 来自 JS 的格式错误的调用:字段大小不同
- apache-spark - RDD沿袭和DAG有什么区别?
- php - the_content() 中的文本显示为从容器中延伸出来的单行
- java - 嘿,在使用参数 areEqualByThreeDecimalPlaces(-3.1756, -3.175) 时,我收到一个错误:更多详情见下文
- python - 根据使用的夹具添加 pytest 标记进行测试
- firebase - 尝试创建列表...使用来自 firebase(流生成器)的数据,但出现错误