Flutter runZonedGuarded捕捉不到未处理错误问题的原因

其实就是一个沙盒,只会捕捉沙盒里面没有被处理的犯人(异常),当在body参数返回或者执行结束后,后续body再出发错误就不再被捕捉了

源码如下:

R runZonedGuarded(R body(), void onError(Object error, StackTrace stack),
    {Map zoneValues, ZoneSpecification zoneSpecification}) {
  ArgumentError.checkNotNull(body, "body");
  ArgumentError.checkNotNull(onError, "onError");

  HandleUncaughtErrorHandler errorHandler = (Zone self, ZoneDelegate parent,
      Zone zone, error, StackTrace stackTrace) {
    try {
      self.parent.runBinary(onError, error, stackTrace);
    } catch (e, s) {
      if (identical(e, error)) {
        parent.handleUncaughtError(zone, error, stackTrace);
      } else {
        parent.handleUncaughtError(zone, e, s);
      }
    }
  };
  if (zoneSpecification == null) {
    zoneSpecification =
        new ZoneSpecification(handleUncaughtError: errorHandler);
  } else {
    zoneSpecification = new ZoneSpecification.from(zoneSpecification,
        handleUncaughtError: errorHandler);
  }
  try {
    return _runZoned(body, zoneValues, zoneSpecification);
  } catch (error, stackTrace) {
    onError(error, stackTrace);
  }
  return null;
}

伪代码说明

// 收到返回值之后不再捕捉此runZonedGuarded内的未处理异常。
runZonedGuarded(
    getWidget,
    onErrorHandler
  );
  
  Widget getWidget() {
    return SomethingWidget(); // 某些Widget.
  }
  
  onErrorHandler(Object error, StackTrace stack) {
    //……
  }

解决方法可以通过在main函数最外层使用,如:

// 这样就可以处理所有未处理的异常了。
void main() async {
  runZonedGuarded(() => runApp(const App()));
 }

你可能感兴趣的:(flutter,dart,问题解决,解决方案)