// 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); var cause = this.cause; 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(Object exception, StackTrace 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, this.stackTrace); /// 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); } var exception = this.exception; if (exception is AnalysisException) { buffer.writeln(exception.message); buffer.writeln(stackTrace.toString()); CaughtException? cause = exception.cause; if (cause != null) { buffer.write('Caused by '); cause._writeOn(buffer); } } else { buffer.writeln(exception.toString()); 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 super.message, super.exception, super.stackTrace) : super.withMessage(); /// Create a [SilentException] to wrap a [CaughtException], adding a /// [message]. SilentException.wrapInMessage(String message, CaughtException exception) : this(message, exception, StackTrace.current); }