Your Site Title

Flutter Log

Flutter异常分为VM异常和Dart异常: Dart异常: 出错不会导致崩溃, 一般会导致代码不继承执行(没有任何反应),如果是界面错误会导致跳转ErrorWidget VM异常:会导致程序崩溃,跳出

Dart异常分为同步异常和异步异常: 同步异常:可以使用try-catch捕获 异步异常:使用try-catch捕获不到

Flutter日志输出,看print函数会发现,如果设置了Zone会调用printToZone, 如果没有会调用printToConsole(). Flutter中Zone, 是一个封闭区域,为了让异步 调用之间保持稳定,代码总在当前区域的上下文中执行。主要用来处理print, timers, microtasks or how uncaught errors are handled. runZone创建子Zone, Zone.current获取当前Zone, Zone.root获取根Zone.

收集VM异常:

FlutterError.onError = (details) {
    FlutterError.dumpErrorToConsole(details); // 交给控制台处理
    // Zone.current.handleUncaughtError(details.exception, details.stack); 交给Zone的未捕获异常处理
};

Zone:

runZoned(() {
    // 运行任务
    runApp(MyApp());
},
// 获取打印信息
zoneSpecification: ZoneSpecification(
    print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
    parent.print(zone, line);
// 获取未捕获异常 等同于runZoned参数onError
}, handleUncaughtError: (Zone self, ZoneDelegate parent, Zone zone,
         Object error, StackTrace stackTrace) {
}));

Reference

Zone