| Index: utils/pub/pub.dart
|
| diff --git a/utils/pub/pub.dart b/utils/pub/pub.dart
|
| index 302420ffc184bf0baed30a298309420644a1bfe3..163090e5610b668cbdb85fdc079c782dba6e5914 100644
|
| --- a/utils/pub/pub.dart
|
| +++ b/utils/pub/pub.dart
|
| @@ -235,12 +235,19 @@ abstract class PubCommand {
|
| handleError(error, trace) {
|
| // This is basically the top-level exception handler so that we don't
|
| // spew a stack trace on our users.
|
| - var message = error.toString();
|
| -
|
| - // TODO(rnystrom): The default exception implementation class puts
|
| - // "Exception:" in the output, so strip that off.
|
| - if (message.startsWith("Exception: ")) {
|
| - message = message.substring("Exception: ".length);
|
| + var message;
|
| +
|
| + try {
|
| + // Most exception types have a "message" property. We prefer this since
|
| + // it skips the "Exception:", "HttpException:", etc. prefix that calling
|
| + // toString() adds. But, alas, "message" isn't actually defined in the
|
| + // base Exception type so there's no easy way to know if it's available
|
| + // short of a giant pile of type tests for each known exception type.
|
| + //
|
| + // So just try it. If it throws, default to toString().
|
| + message = error.message;
|
| + } on NoSuchMethodError catch (_) {
|
| + message = error.toString();
|
| }
|
|
|
| log.error(message);
|
|
|