8a0d30d4e2
R=brianwilkerson@google.com Change-Id: I7a587daf9715ded6450b28ecf3892ce4181aeb37 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/129421 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
136 lines
3.6 KiB
Dart
136 lines
3.6 KiB
Dart
// Copyright (c) 2014, 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.
|
|
|
|
/**
|
|
* An exception that occurred during the analysis of one or more sources.
|
|
*/
|
|
class AnalysisException implements Exception {
|
|
/**
|
|
* The message that explains why the exception occurred.
|
|
*/
|
|
final String message;
|
|
|
|
/**
|
|
* The exception that caused this exception, or `null` if this exception was
|
|
* not caused by another exception.
|
|
*/
|
|
final CaughtException cause;
|
|
|
|
/**
|
|
* Initialize a newly created exception to have the given [message] and
|
|
* [cause].
|
|
*/
|
|
AnalysisException([this.message = 'Exception', this.cause]);
|
|
|
|
@override
|
|
String toString() {
|
|
StringBuffer buffer = StringBuffer();
|
|
buffer.write('$runtimeType: ');
|
|
buffer.writeln(message);
|
|
if (cause != null) {
|
|
buffer.write('Caused by ');
|
|
cause._writeOn(buffer);
|
|
}
|
|
return buffer.toString();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An exception that was caught and has an associated stack trace.
|
|
*/
|
|
class CaughtException implements Exception {
|
|
/**
|
|
* The exception that was caught.
|
|
*/
|
|
final Object exception;
|
|
|
|
/**
|
|
* The message describing where/how/why this was caught.
|
|
*/
|
|
final String message;
|
|
|
|
/**
|
|
* The stack trace associated with the exception.
|
|
*/
|
|
StackTrace stackTrace;
|
|
|
|
/**
|
|
* Initialize a newly created caught exception to have the given [exception]
|
|
* and [stackTrace].
|
|
*/
|
|
CaughtException(exception, stackTrace)
|
|
: this.withMessage(null, exception, stackTrace);
|
|
|
|
/**
|
|
* Initialize a newly created caught exception to have the given [exception],
|
|
* [stackTrace], and [message].
|
|
*/
|
|
CaughtException.withMessage(this.message, this.exception, stackTrace)
|
|
: this.stackTrace = stackTrace ?? StackTrace.current;
|
|
|
|
/**
|
|
* Recursively unwrap this [CaughtException] if it itself contains a
|
|
* [CaughtException].
|
|
*
|
|
* If it does not contain a [CaughtException], simply return this instance.
|
|
*/
|
|
CaughtException get rootCaughtException {
|
|
if (exception is CaughtException) {
|
|
return (exception as CaughtException).rootCaughtException;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
@override
|
|
String toString() {
|
|
StringBuffer buffer = StringBuffer();
|
|
_writeOn(buffer);
|
|
return buffer.toString();
|
|
}
|
|
|
|
/**
|
|
* Write a textual representation of the caught exception and its associated
|
|
* stack trace.
|
|
*/
|
|
void _writeOn(StringBuffer buffer) {
|
|
if (message != null) {
|
|
buffer.writeln(message);
|
|
}
|
|
if (exception is AnalysisException) {
|
|
AnalysisException analysisException = exception;
|
|
buffer.writeln(analysisException.message);
|
|
if (stackTrace != null) {
|
|
buffer.writeln(stackTrace.toString());
|
|
}
|
|
CaughtException cause = analysisException.cause;
|
|
if (cause != null) {
|
|
buffer.write('Caused by ');
|
|
cause._writeOn(buffer);
|
|
}
|
|
} else {
|
|
buffer.writeln(exception.toString());
|
|
if (stackTrace != null) {
|
|
buffer.writeln(stackTrace.toString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A form of [CaughtException] that should be silent to users.
|
|
*
|
|
* This is still considered an exceptional situation and will be sent to crash
|
|
* reporting.
|
|
*/
|
|
class SilentException extends CaughtException {
|
|
SilentException(String message, exception, stackTrace)
|
|
: super.withMessage(message, exception, stackTrace);
|
|
|
|
/**
|
|
* Create a [SilentException] to wrap a [CaughtException], adding a [message].
|
|
*/
|
|
SilentException.wrapInMessage(String message, CaughtException exception)
|
|
: this(message, exception, null);
|
|
}
|