flutter 全局异常捕获
2021-07-05 本文已影响0人
李小轰
dart开发中,try-catch使用方式:
//捕获同步异常
try {
...
} catch (e) {
print("try-catch error : $e");
}
//捕获异步异常
Future.error("error").catchError((e) {
print("try-catch error : $e");
});
我们使用如上方式,在关键代码处对Flutter进行异常捕获。不过,还有部分异常是在我们没有考虑到的场景下发生的,这些我们没有做埋点处理的异常如何捕获呢?
直接给出异常捕获模板:
void main() {
void reportErrorAndLog(FlutterErrorDetails details) {
final errorMsg = {
"exception": details.exceptionAsString(),
"stackTrace": details.stack.toString(),
};
print("reportErrorAndLog : $errorMsg");
...//上报错误
}
FlutterErrorDetails makeDetails(Object error, StackTrace stackTrace) {
// 构建错误信息
return FlutterErrorDetails(stack: stackTrace, exception: error);
}
FlutterError.onError = (FlutterErrorDetails details) {
//获取 widget build 过程中出现的异常错误
reportErrorAndLog(details);
};
runZonedGuarded(
() {
runApp(MyApp());
},
(error, stackTrace) {
//没被我们catch的异常
reportErrorAndLog(makeDetails(error, stackTrace));
},
);
}
关键点说明:
- runZonedGuarded函数给执行对象制定了一个zone,zone 可理解是一个代码执行沙箱,它能捕获所有未处理的异常(包括同步与异步异常)。
- FlutterError.onError是一个静态函数,可捕获Widget在build阶段发生的错误异常,我们对其进行重写,把异常信息进行上报处理。