Spec-Zone.ru › Dart 2

dart:async

runZonedGuarded<R> function

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

Запускает body в собственной зоне ошибок.

Создаёт новую зону с помощью Zone.fork на основе zoneSpecification и zoneValues, затем запускает body в этой зоне и возвращает результат.

Функция onError используется как для обработки асинхронных ошибок путём переопределения ZoneSpecification.handleUncaughtError в zoneSpecification, если она задана, так и для обработки ошибок, синхронно выбрасываемых вызовом body.

Если в body синхронно возникает ошибка, то выбрасывание исключения в обработчике onError заставляет вызов runZonedGuarded выбросить эту ошибку, а в противном случае вызов runZonedGuarded возвращает null.

Зона всегда будет зоной ошибок (Zone.errorZone), поэтому возврат future, созданного внутри зоны, и ожидание его завершения вне зоны сопряжены с риском, что завершение 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;
}

© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.19.6/dart-async/runZonedGuarded.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API