| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /// Throws a specialized exception to exit with an actionable [message]. |
| /// |
| /// A [ToolExit] is interpreted by the `flutter` tool to mean "exit the tool |
| /// gracefully with a human actionable error [message]", and should be used in |
| /// scenarios where a human (developer) can make a decision based on the result. |
| /// |
| /// For example: |
| /// |
| /// - An invalid set of command-line arguments were passed. |
| /// - The network appears to be unavailable. |
| /// - The project needs to be modified in some way for a command to succeed. |
| /// |
| /// Prefer throwing an error (such as [StateError]) for cases such as: |
| /// |
| /// - An internal tool (such as invoking `dart`) returns an unexpected response. |
| /// - An unrecoverable state is detected deeper in execution. |
| /// |
| /// A stack trace is included in the tool output when `--verbose` is specified. |
| /// |
| /// While supported, avoid passing `null` for [message]; this is a legacy |
| /// behavior that is not intended. For example, provide the message directly |
| /// instead of using a combination of `logger.error` and `throwToolExit`: |
| /// |
| /// ```diff |
| /// - logger.error('Expected --foo to be provided in conjunction with --bar'); |
| /// - throwToolExit(null); |
| /// + throwToolExit('Expected --foo to be provided in conjunction with --bar'); |
| /// ``` |
| Never throwToolExit(String? message, {int? exitCode}) { |
| throw ToolExit._(message, exitCode: exitCode); |
| } |
| |
| /// A specialized exception to exit with an actionable [message]. |
| /// |
| /// See [throwToolExit]. |
| final class ToolExit implements Exception { |
| ToolExit._(this.message, {this.exitCode}); |
| |
| final String? message; |
| final int? exitCode; |
| |
| @override |
| String toString() => 'Error: $message'; |
| } |