Spec-Zone.ru › Dart 2

dart:async

Функция runZonedGuarded<R>

  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.

Зона всегда является зоной обработки ошибок.

Ошибки никогда не пересекают границы зон обработки ошибок самостоятельно. Ошибки, которые пытаются пересечь границы зон обработки ошибок, считаются необработанными в исходной зоне обработки ошибок.

var future = Future.value(499);
runZonedGuarded(() {
  var future2 = future.then((_) { throw "error in first error-zone"; });
  runZonedGuarded(() {
    var future3 = future2.catchError((e) { print("Never reached!"); });
  }, (e, s) { print("unused error handler"); });
}, (e, s) { print("catches error of first error-zone."); });

Пример:

runZonedGuarded(() {
  Future(() { throw "asynchronous error"; });
}, (e, s) => print(e));  // Will print "asynchronous error".

Возможна ручная передача ошибки из одной зоны обработки ошибок в другую путём её повторного выброса в новой зоне. Если onError выбросит ошибку, то эта ошибка произойдёт в исходной зоне, где был вызван runZoned.

Реализация

@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 =
        new 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.18.5/dart-async/runZonedGuarded.html

Spec-Zone.ru

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