| Index: tests/lib_2/async/catch_errors.dart
|
| diff --git a/tests/lib_2/async/catch_errors.dart b/tests/lib_2/async/catch_errors.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..925ce2c2f269a3b1c3d3eb74acc86e0119078adc
|
| --- /dev/null
|
| +++ b/tests/lib_2/async/catch_errors.dart
|
| @@ -0,0 +1,55 @@
|
| +library catch_errors;
|
| +
|
| +import 'dart:async';
|
| +
|
| +Stream catchErrors(void body()) {
|
| + StreamController controller;
|
| +
|
| + bool onError(e, st) {
|
| + controller.add(e);
|
| + return true;
|
| + }
|
| +
|
| + void onListen() {
|
| + runZoned(body, onError: onError);
|
| + }
|
| +
|
| + controller = new StreamController(onListen: onListen);
|
| + return controller.stream;
|
| +}
|
| +
|
| +runZonedScheduleMicrotask(body(),
|
| + {void onScheduleMicrotask(void callback()), Function onError}) {
|
| + if (onScheduleMicrotask == null) {
|
| + return runZoned(body, onError: onError);
|
| + }
|
| + HandleUncaughtErrorHandler errorHandler;
|
| + if (onError != null) {
|
| + errorHandler = (Zone self, ZoneDelegate parent, Zone zone, error,
|
| + StackTrace stackTrace) {
|
| + try {
|
| + return self.parent.runUnary(onError, error);
|
| + } catch (e, s) {
|
| + if (identical(e, error)) {
|
| + return parent.handleUncaughtError(zone, error, stackTrace);
|
| + } else {
|
| + return parent.handleUncaughtError(zone, e, s);
|
| + }
|
| + }
|
| + };
|
| + }
|
| + ScheduleMicrotaskHandler asyncHandler;
|
| + if (onScheduleMicrotask != null) {
|
| + asyncHandler = (Zone self, ZoneDelegate parent, Zone zone, f()) {
|
| + self.parent.runUnary(onScheduleMicrotask, () => zone.runGuarded(f));
|
| + };
|
| + }
|
| + ZoneSpecification specification = new ZoneSpecification(
|
| + handleUncaughtError: errorHandler, scheduleMicrotask: asyncHandler);
|
| + Zone zone = Zone.current.fork(specification: specification);
|
| + if (onError != null) {
|
| + return zone.runGuarded(body);
|
| + } else {
|
| + return zone.run(body);
|
| + }
|
| +}
|
|
|