runZonedGuarded<R> 函数

  1. @Since("2.8")
R? runZonedGuarded<R>(
  1. R body(
      ),
    1. void onError(
      1. Object error,
      2. StackTrace stack
      ),
    2. {Map<Object?, Object?>? zoneValues,
    3. ZoneSpecification? zoneSpecification}}
    )

    在它自己的错误区域中运行 body

    根据 zoneSpecificationzoneValues 使用 Zone.fork 创建一个新的区域,然后在那个区域中运行 body 并返回结果。

    onError 函数用于处理异步错误,通过在 zoneSpecification 中覆盖 ZoneSpecification.handleUncaughtError,如果有的话,以及处理由对 body 的调用同步抛出的错误。

    如果在 body 中同步发生错误,则抛出 onError 处理程序会导致对 runZonedGuarded 的调用抛出该错误;否则,对 runZonedGuarded 的调用返回 null

    创建的区域始终是 错误区域。未来中的异步错误永远不会在不同 Zone.errorZone 的区域之间跨越区域边界。该行为的结果可能是有可能在属于不同错误区域的区域中使用创建的区域完成的 Future 似乎永远不会完成。在某些区域中多次尝试使用该未来会再次在该未来的原始错误区域中报告错误。

    实现

    @Since("2.8")
    R? runZonedGuarded<R>(R body(), void onError(Object error, StackTrace stack),
        {Map<Object?, Object?>? zoneValues, ZoneSpecification? zoneSpecification}) {
      checkNotNullable(body, "body");
      checkNotNullable(onError, "onError");
      _Zone parentZone = Zone._current;
      HandleUncaughtErrorHandler errorHandler = (Zone self, ZoneDelegate parent,
          Zone zone, Object error, StackTrace stackTrace) {
        try {
          parentZone.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 = ZoneSpecification(handleUncaughtError: errorHandler);
      } else {
        zoneSpecification = ZoneSpecification.from(zoneSpecification,
            handleUncaughtError: errorHandler);
      }
      try {
        return _runZoned<R>(body, zoneValues, zoneSpecification);
      } catch (error, stackTrace) {
        onError(error, stackTrace);
      }
      return null;
    }