Index: sdk/lib/async/async_error.dart |
diff --git a/sdk/lib/async/async_error.dart b/sdk/lib/async/async_error.dart |
index 05fbb88b211b769782bcc8d43639fdbc52ff98c5..d5732165b2b1f026de27c4633b9de972d35c5c69 100644 |
--- a/sdk/lib/async/async_error.dart |
+++ b/sdk/lib/async/async_error.dart |
@@ -11,6 +11,23 @@ void _attachStackTrace(o, st) { |
_stackTraceExpando[o] = st; |
} |
+_invokeErrorHandler(Function errorHandler, |
+ Object error, StackTrace stackTrace) { |
+ if (errorHandler is ZoneBinaryCallback) { |
+ return errorHandler(error, stackTrace); |
+ } else { |
+ return errorHandler(error); |
+ } |
+} |
+ |
+Function _registerErrorHandler(Function errorHandler, Zone zone) { |
+ if (errorHandler is ZoneBinaryCallback) { |
+ return zone.registerBinaryCallback(errorHandler); |
+ } else { |
+ return zone.registerUnaryCallback(errorHandler); |
+ } |
+} |
+ |
/** |
* *This is an experimental API.* |
* |
@@ -25,3 +42,38 @@ getAttachedStackTrace(o) { |
if (o == null || o is bool || o is num || o is String) return null; |
return _stackTraceExpando[o]; |
} |
+ |
+class _AsyncError implements Error { |
+ final error; |
+ final StackTrace stackTrace; |
+ |
+ _AsyncError(this.error, this.stackTrace); |
+} |
+ |
+class _UncaughtAsyncError extends _AsyncError { |
+ _UncaughtAsyncError(error, StackTrace stackTrace) |
+ : super(error, _getBestStackTrace(error, stackTrace)) { |
+ // Clear the attached stack trace. |
+ _attachStackTrace(error, null); |
+ } |
+ |
+ static StackTrace _getBestStackTrace(error, StackTrace stackTrace) { |
+ if (stackTrace != null) return stackTrace; |
+ var trace = getAttachedStackTrace(error); |
+ if (trace != null) return trace; |
+ if (error is Error) { |
+ Error e = error; |
+ return e.stackTrace; |
+ } |
+ return null; |
+ } |
+ |
+ String toString() { |
+ String result = "Uncaught Error: ${error}"; |
+ |
+ if (stackTrace != null) { |
+ result += "\nStack Trace:\n$stackTrace"; |
+ } |
+ return result; |
+ } |
+} |