Index: tests/lib_strong/async/catch_errors.dart |
diff --git a/tests/lib_strong/async/catch_errors.dart b/tests/lib_strong/async/catch_errors.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c84c9aadc39558aab6db0084d79f59d147fb39e7 |
--- /dev/null |
+++ b/tests/lib_strong/async/catch_errors.dart |
@@ -0,0 +1,57 @@ |
+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); |
+ } |
+} |