// 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'; }