| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| part of dart.async; |
| |
| final Expando _stackTraceExpando = new Expando("asynchronous error"); |
| |
| void _attachStackTrace(o, StackTrace st) { |
| if (o == null || o is bool || o is num || o is String) return; |
| _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); |
| } |
| } |
| |
| /** |
| * *DEPRECATED*. Use explicit stack trace arguments instead. |
| * |
| * Get the [StackTrace] attached to [o]. |
| * |
| * If object [o] was thrown and caught in a dart:async method, a [StackTrace] |
| * object was attached to it. Use [getAttachedStackTrace] to get that object. |
| * |
| * Returns [null] if no [StackTrace] was attached. |
| */ |
| @deprecated |
| 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; |
| } |
| } |