runZonedGuarded<R> 函数
- @Since("2.8")
- R body(
- void onError(
- Object error,
- StackTrace stack
- {Map<
Object?, Object?> ? zoneValues, - ZoneSpecification? zoneSpecification}}
在它自己的错误区域中运行 body
。
根据 zoneSpecification
和 zoneValues
使用 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;
}