前提:Flutter异常指的是Flutter程序Dart代码运行时意外发生的错误事件。我们可以通过try-catch机制来获取它。但是Dart采用时间循环机制不强制要求处理异常处理,各个任务的运行状态是相互独立,即便某个任务出现了异常我们没有捕获到,Dart也不会退出。只是导致当前任务后续的代码不会被执行,用户仍可以继续使用其他功能。
一、App异常
同步异常:可以通过try-catch捕获,异步异常:通过Future的catchError语句捕获。
//使用try-catch捕获同步异常
try {
throw StateError('This is a Dart exception.');
}
catch(e) {
print(e);
}
//使用catchError捕获异步异常
Future.delayed(Duration(seconds: 1))
.then((e) => throw StateError('This is a Dart exception in Future.'))
.catchError((e)=>print(e));
//注意,以下代码无法捕获异步异常
try {
Future.delayed(Duration(seconds: 1))
.then((e) => throw StateError('This is a Dart exception in Future.'))
}
catch(e) {
print("This line will never be executed. ");
}
直接捕获Zone.runZoned方法,Zone表示一个代码执行的环境范围,类似于沙盒,不同沙盒之间是相互隔离的。
runZoned(() {
//同步抛出异常
throw StateError('This is a Dart exception.');
}, onError: (dynamic e, StackTrace stack) {
print('Sync error caught by zone');
});
runZoned(() {
//异步抛出异常
Future.delayed(Duration(seconds: 1))
.then((e) => throw StateError('This is a Dart exception in Future.'));
}, onError: (dynamic e, StackTrace stack) {
print('Async error aught by zone');
});
二、Famework异常
flutter框架引发的异常,通常由应用代码触发flutter框架底层异常判断引起的。
为了集中处理框架异常,Flutter 提供了 FlutterError 类,这个类的 onError 属性会在接收到框架异常时执行相应的回调。因此,要实现自定义捕获逻辑,我们只要为它提供一个自定义的错误处理回调即可。在下面的代码中,我们使用 Zone 提供的 handleUncaughtError 语句,将 Flutter 框架的异常统一转发到当前的 Zone 中,这样我们就可以统一使用 Zone 去处理应用内的所有异常了:
FlutterError.onError = (FlutterErrorDetails details) async {
//转发至Zone中
Zone.current.handleUncaughtError(details.exception, details.stack);
};
runZoned<Future<Null>>(() async {
runApp(MyApp());
}, onError: (error, stackTrace) async {
//Do sth for error
});
三、使用bugly来搜集异常log