runZonedGuarded< R> function
- @Since("2.8")
- R body( ),
- void onError(
- Object error,
- StackTrace stack
- {Map<
Object?, Object?>? zoneValues, - 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