flutter 全局异常捕获

1,215 阅读1分钟

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阶段发生的错误异常,我们对其进行重写,把异常信息进行上报处理。