| Index: sdk/lib/async/async_error.dart
|
| diff --git a/sdk/lib/async/async_error.dart b/sdk/lib/async/async_error.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..aad80b7f8b5a2c818e954ca4c49cf75f45c3f0f6
|
| --- /dev/null
|
| +++ b/sdk/lib/async/async_error.dart
|
| @@ -0,0 +1,74 @@
|
| +// 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;
|
| +
|
| +/**
|
| + * Error result of an asynchronous computation.
|
| + */
|
| +class AsyncError {
|
| + /** The actual error thrown by the computation. */
|
| + final Object error;
|
| + /** Stack trace corresponding to the error, if available. */
|
| + final Object stackTrace;
|
| + /** Asynchronous error leading to this error, if error handling fails. */
|
| + final AsyncError cause;
|
| +
|
| + // TODO(lrn): When possible, combine into one constructor with both optional
|
| + // positional and named arguments.
|
| + AsyncError(Object this.error, [Object this.stackTrace]): cause = null;
|
| + AsyncError.withCause(Object this.error, Object this.stackTrace, this.cause);
|
| +
|
| + void _writeOn(StringBuffer buffer) {
|
| + buffer.add("'");
|
| + String message;
|
| + try {
|
| + message = error.toString();
|
| + } catch (e) {
|
| + message = Error.safeToString(error);
|
| + }
|
| + buffer.add(message);
|
| + buffer.add("'\n");
|
| + if (stackTrace != null) {
|
| + buffer.add("Stack trace:\n");
|
| + buffer.add(stackTrace.toString());
|
| + buffer.add("\n");
|
| + }
|
| + }
|
| +
|
| + String toString() {
|
| + StringBuffer buffer = new StringBuffer();
|
| + buffer.add("AsyncError: ");
|
| + _writeOn(buffer);
|
| + AsyncError cause = this.cause;
|
| + while (cause != null) {
|
| + buffer.add("Caused by: ");
|
| + cause._writeOn(buffer);
|
| + cause = cause.cause;
|
| + }
|
| + return buffer.toString();
|
| + }
|
| +
|
| + throwDelayed() {
|
| + reportError() {
|
| + print("Uncaught Error: $error");
|
| + if (stackTrace != null) {
|
| + print("Stack Trace:\n$stackTrace\n");
|
| + }
|
| + }
|
| +
|
| + try {
|
| + new Timer(0, (_) {
|
| + reportError();
|
| + // TODO(floitsch): we potentially want to call the global error handler
|
| + // directly so that we can pass the stack trace.
|
| + throw error;
|
| + });
|
| + } catch (e) {
|
| + // Unfortunately there is not much more we can do...
|
| + reportError();
|
| + }
|
| + }
|
| +}
|
| +
|
|
|