Функция runZonedGuarded< R>
- @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.
Зона всегда является зоной обработки ошибок.
Ошибки никогда не пересекают границы зон обработки ошибок самостоятельно. Ошибки, которые пытаются пересечь границы зон обработки ошибок, считаются необработанными в исходной зоне обработки ошибок.
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