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); |
+ } |
+} |