Flutter异常捕获

96 阅读1分钟

使用 runZoned和FlutterError.onError

Future<Null> main() async {
  var isInDebugMode = false;
  FlutterError.onError = (FlutterErrorDetails details) async {
    if (isInDebugMode) {
      FlutterError.dumpErrorToConsole(details);
    } else {
      Zone.current.handleUncaughtError(details.exception, details.stack);
    }
  };

  runZoned<Future<Null>>(() async {
    runApp(new HomeApp());
  }, onError: (error, stackTrace) async {
    await _reportError(error, stackTrace);
  });
}
void _reportError(Object error, StackTrace stackTrace)async{

  XJPathManager.saveErrorInfo('report error:\n'+error.toString()+'\n'+ 'stackTrace:\n'+stackTrace.toString());
}
// 储存错误信息
static void saveErrorInfo(String string) async{
  try {
    var path = await getErrorPathPath();
    var dateStr = XJDateUtil.getDateStrByDateTime(DateTime.now(),format: DateFormat.YEAR_MONTH_DAY);
    var file = File(path + dateStr + '.txt');
      print('errorFile saveStr:\n'+string);
      var timeStr = XJDateUtil.getNowDateStr();
      string = timeStr+'\n'+string+'\n';
      await file.writeAsString(string,mode:FileMode.writeOnlyAppend,flush: true);
  }
  catch (err) {
    print('save error file err:');
    print(err);
  }
}