Flutter异常监控

异常的捕获

可以使用try-catch捕获同步异常,使用catchERROR捕获异步代码的异常。

未捕获异常

可以在main函数中重写FlutterError.onError函数设置默认的未捕获异常处理机制。

1
2
3
4
5
6
7
void main(){
  Flutter.Error.onError = (detail){
    // 异常处理
  };
  
  runApp(MyApp());
}

捕获Future的异常

可以使用zone,zone表示一个代码执行的上下文,给异步代码提供了一个稳定的运行环境,可以理解为一个沙盒:

1
2
3
4
5
6
7
void main(){
  runZone((){
    runApp(MyApp());
  },onError(error,stackTrace){
    // 异常处理
  });
}

红白屏捕获

可以在main函数中重写ErrorWidgetBuilder:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
void performRebuild() {
    ...
    try {
      ...
    } catch (e, stack) {
      // ErrorWidget.builder回调方法替换错误页面
      built = ErrorWidget.builder(
        _debugReportException(
          ErrorDescription('building $this'),
          e,
          stack,
          informationCollector: () sync* {
            yield DiagnosticsDebugCreator(DebugCreator(this));
          },
        ),
      );
    }
    ...
  }
  //默认的处理方式,我们也可以在main中覆盖处理
  static ErrorWidgetBuilder builder = _defaultErrorWidgetBuilder;