OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of dart.async; | 5 part of dart.async; |
6 | 6 |
7 final Expando _stackTraceExpando = new Expando("asynchronous error"); | |
8 | |
9 void _attachStackTrace(o, StackTrace st) { | |
10 if (o == null || o is bool || o is num || o is String) return; | |
11 _stackTraceExpando[o] = st; | |
12 } | |
13 | |
14 _invokeErrorHandler(Function errorHandler, | 7 _invokeErrorHandler(Function errorHandler, |
15 Object error, StackTrace stackTrace) { | 8 Object error, StackTrace stackTrace) { |
16 if (errorHandler is ZoneBinaryCallback) { | 9 if (errorHandler is ZoneBinaryCallback) { |
17 return errorHandler(error, stackTrace); | 10 return errorHandler(error, stackTrace); |
18 } else { | 11 } else { |
19 return errorHandler(error); | 12 return errorHandler(error); |
20 } | 13 } |
21 } | 14 } |
22 | 15 |
23 Function _registerErrorHandler(Function errorHandler, Zone zone) { | 16 Function _registerErrorHandler(Function errorHandler, Zone zone) { |
24 if (errorHandler is ZoneBinaryCallback) { | 17 if (errorHandler is ZoneBinaryCallback) { |
25 return zone.registerBinaryCallback(errorHandler); | 18 return zone.registerBinaryCallback(errorHandler); |
26 } else { | 19 } else { |
27 return zone.registerUnaryCallback(errorHandler); | 20 return zone.registerUnaryCallback(errorHandler); |
28 } | 21 } |
29 } | 22 } |
30 | 23 |
31 /** | |
32 * *DEPRECATED*. Use explicit stack trace arguments instead. | |
33 * | |
34 * Get the [StackTrace] attached to [o]. | |
35 * | |
36 * If object [o] was thrown and caught in a dart:async method, a [StackTrace] | |
37 * object was attached to it. Use [getAttachedStackTrace] to get that object. | |
38 * | |
39 * Returns [null] if no [StackTrace] was attached. | |
40 */ | |
41 @deprecated | |
42 getAttachedStackTrace(o) { | |
43 if (o == null || o is bool || o is num || o is String) return null; | |
44 return _stackTraceExpando[o]; | |
45 } | |
46 | |
47 class _AsyncError implements Error { | 24 class _AsyncError implements Error { |
48 final error; | 25 final error; |
49 final StackTrace stackTrace; | 26 final StackTrace stackTrace; |
50 | 27 |
51 _AsyncError(this.error, this.stackTrace); | 28 _AsyncError(this.error, this.stackTrace); |
52 } | 29 } |
53 | 30 |
54 class _UncaughtAsyncError extends _AsyncError { | 31 class _UncaughtAsyncError extends _AsyncError { |
55 _UncaughtAsyncError(error, StackTrace stackTrace) | 32 _UncaughtAsyncError(error, StackTrace stackTrace) |
56 : super(error, _getBestStackTrace(error, stackTrace)) { | 33 : super(error, _getBestStackTrace(error, stackTrace)); |
57 // Clear the attached stack trace. | |
58 _attachStackTrace(error, null); | |
59 } | |
60 | 34 |
61 static StackTrace _getBestStackTrace(error, StackTrace stackTrace) { | 35 static StackTrace _getBestStackTrace(error, StackTrace stackTrace) { |
62 if (stackTrace != null) return stackTrace; | 36 if (stackTrace != null) return stackTrace; |
63 var trace = getAttachedStackTrace(error); | |
64 if (trace != null) return trace; | |
65 if (error is Error) { | 37 if (error is Error) { |
66 Error e = error; | 38 return error.stackTrace; |
67 return e.stackTrace; | |
68 } | 39 } |
69 return null; | 40 return null; |
70 } | 41 } |
71 | 42 |
72 String toString() { | 43 String toString() { |
73 String result = "Uncaught Error: ${error}"; | 44 String result = "Uncaught Error: ${error}"; |
74 | 45 |
75 if (stackTrace != null) { | 46 if (stackTrace != null) { |
76 result += "\nStack Trace:\n$stackTrace"; | 47 result += "\nStack Trace:\n$stackTrace"; |
77 } | 48 } |
78 return result; | 49 return result; |
79 } | 50 } |
80 } | 51 } |
OLD | NEW |