Reland: [flutter_tool] Where possible, catch only subtypes of Exception (#51774)
diff --git a/packages/flutter_tools/analysis_options.yaml b/packages/flutter_tools/analysis_options.yaml
index 525929f..139938d 100644
--- a/packages/flutter_tools/analysis_options.yaml
+++ b/packages/flutter_tools/analysis_options.yaml
@@ -7,3 +7,4 @@
rules:
unawaited_futures: true
curly_braces_in_flow_control_structures: true
+ avoid_catches_without_on_clauses: true
diff --git a/packages/flutter_tools/lib/runner.dart b/packages/flutter_tools/lib/runner.dart
index 4dd5631..9d75c1e 100644
--- a/packages/flutter_tools/lib/runner.dart
+++ b/packages/flutter_tools/lib/runner.dart
@@ -62,7 +62,8 @@
try {
await runner.run(args);
return await _exit(0);
- } catch (error, stackTrace) {
+ // This catches all exceptions to send to crash logging, etc.
+ } catch (error, stackTrace) { // ignore: avoid_catches_without_on_clauses
firstError = error;
firstStackTrace = stackTrace;
return await _handleToolError(
@@ -135,7 +136,8 @@
await _informUserOfCrash(args, error, stackTrace, errorString);
return _exit(1);
- } catch (error) {
+ // This catch catches all exceptions to ensure the message below is printed.
+ } catch (error) { // ignore: avoid_catches_without_on_clauses
globals.stdio.stderrWrite(
'Unable to generate crash report due to secondary error: $error\n'
'please let us know at https://github.com/flutter/flutter/issues.\n',
@@ -243,7 +245,7 @@
);
return logger.statusText;
- } catch (error, trace) {
+ } on Exception catch (error, trace) {
return 'encountered exception: $error\n\n${trace.toString().trim()}\n';
}
}
@@ -271,7 +273,9 @@
globals.printTrace('exiting with code $code');
exit(code);
completer.complete();
- } catch (error, stackTrace) {
+ // This catches all exceptions becauce the error is propagated on the
+ // completer.
+ } catch (error, stackTrace) { // ignore: avoid_catches_without_on_clauses
completer.completeError(error, stackTrace);
}
});
diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index 53a0065..975fd27 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -177,7 +177,7 @@
} finally {
console.destroy();
}
- } catch (e) {
+ } on Exception catch (e) {
globals.printTrace('Failed to fetch avd name for emulator at $host:$port: $e');
// If we fail to connect to the device, we should not fail so just return
// an empty name. This data is best-effort.
@@ -299,7 +299,7 @@
return true;
}
globals.printError('The ADB at "${getAdbPath(androidSdk)}" is too old; please install version 1.0.39 or later.');
- } catch (error, trace) {
+ } on Exception catch (error, trace) {
globals.printError('Error running ADB: $error', stackTrace: trace);
}
@@ -335,7 +335,7 @@
}
return true;
- } catch (e, stacktrace) {
+ } on Exception catch (e, stacktrace) {
globals.printError('Unexpected failure from adb: $e');
globals.printError('Stacktrace: $stacktrace');
return false;
@@ -366,7 +366,7 @@
try {
final RunResult listOut = await runAdbCheckedAsync(<String>['shell', 'pm', 'list', 'packages', app.id]);
return LineSplitter.split(listOut.stdout).contains('package:${app.id}');
- } catch (error) {
+ } on Exception catch (error) {
globals.printTrace('$error');
return false;
}
@@ -432,7 +432,7 @@
throwOnError: true,
);
uninstallOut = uninstallResult.stdout;
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('adb uninstall failed: $error');
return false;
}
@@ -631,7 +631,7 @@
}
return LaunchResult.succeeded(observatoryUri: observatoryUri);
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('Error waiting for a debug connection: $error');
return LaunchResult.failed();
} finally {
@@ -696,7 +696,7 @@
output = runAdbCheckedSync(<String>[
'shell', '-x', 'logcat', '-v', 'time', '-t', '1'
]);
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('Failed to extract the most recent timestamp from the Android log: $error.');
return null;
}
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index bb4a429..567ff46 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -492,7 +492,7 @@
.map((FileSystemEntity entity) {
try {
return Version.parse(entity.basename);
- } catch (error) {
+ } on Exception {
return null;
}
})
@@ -518,7 +518,7 @@
.group(1);
platformVersion = int.parse(versionString);
}
- } catch (error) {
+ } on Exception {
return null;
}
@@ -583,7 +583,7 @@
return fileSystem.path.join(javaHome, 'bin', 'java');
}
}
- } catch (_) { /* ignore */ }
+ } on Exception catch (_) { /* ignore */ }
}
// Fallback to PATH based lookup.
diff --git a/packages/flutter_tools/lib/src/android/android_studio.dart b/packages/flutter_tools/lib/src/android/android_studio.dart
index 961b673..eb07945 100644
--- a/packages/flutter_tools/lib/src/android/android_studio.dart
+++ b/packages/flutter_tools/lib/src/android/android_studio.dart
@@ -93,7 +93,7 @@
installPath = globals.fs
.file(globals.fs.path.join(homeDotDir.path, 'system', '.home'))
.readAsStringSync();
- } catch (e) {
+ } on Exception {
// ignored, installPath will be null, which is handled below
}
if (installPath != null && globals.fs.isDirectorySync(installPath)) {
@@ -200,7 +200,7 @@
_checkForStudio(directory.path);
}
}
- } catch (e) {
+ } on Exception catch (e) {
globals.printTrace('Exception while looking for Android Studio: $e');
}
}
diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart
index 0043926..ef3d5fa 100644
--- a/packages/flutter_tools/lib/src/android/android_workflow.dart
+++ b/packages/flutter_tools/lib/src/android/android_workflow.dart
@@ -122,7 +122,7 @@
final List<String> versionLines = (result.stderr as String).split('\n');
javaVersionText = versionLines.length >= 2 ? versionLines[1] : versionLines[0];
}
- } catch (error) {
+ } on Exception catch (error) {
_logger.printTrace(error.toString());
}
if (javaVersionText == null || javaVersionText.isEmpty) {
@@ -287,7 +287,7 @@
final List<String> versionLines = (result.stderr as String).split('\n');
javaVersion = versionLines.length >= 2 ? versionLines[1] : versionLines[0];
}
- } catch (error) {
+ } on Exception catch (error) {
globals.printTrace(error.toString());
}
if (javaVersion == null) {
@@ -389,7 +389,7 @@
globals.stdio.addStdoutStream(process.stdout),
globals.stdio.addStderrStream(process.stderr),
]);
- } catch (err, stack) {
+ } on Exception catch (err, stack) {
globals.printTrace('Echoing stdout or stderr from the license subprocess failed:');
globals.printTrace('$err\n$stack');
}
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart
index fbc443f..9cd290f 100644
--- a/packages/flutter_tools/lib/src/asset.dart
+++ b/packages/flutter_tools/lib/src/asset.dart
@@ -128,7 +128,7 @@
FlutterManifest flutterManifest;
try {
flutterManifest = FlutterManifest.createFromPath(manifestPath);
- } catch (e) {
+ } on Exception catch (e) {
globals.printStatus('Error detected in pubspec.yaml:', emphasis: true);
globals.printError('$e');
return 1;
diff --git a/packages/flutter_tools/lib/src/base/async_guard.dart b/packages/flutter_tools/lib/src/base/async_guard.dart
index 4515174..d25cf58 100644
--- a/packages/flutter_tools/lib/src/base/async_guard.dart
+++ b/packages/flutter_tools/lib/src/base/async_guard.dart
@@ -112,7 +112,9 @@
if (!completer.isCompleted) {
completer.complete(result);
}
- } catch (e, s) {
+ // This catches all exceptions so that they can be propagated to the
+ // caller-supplied error handling or the completer.
+ } catch (e, s) { // ignore: avoid_catches_without_on_clauses
handleError(e, s);
}
}, onError: (Object e, StackTrace s) {
diff --git a/packages/flutter_tools/lib/src/base/fingerprint.dart b/packages/flutter_tools/lib/src/base/fingerprint.dart
index 815acc2..f20e107 100644
--- a/packages/flutter_tools/lib/src/base/fingerprint.dart
+++ b/packages/flutter_tools/lib/src/base/fingerprint.dart
@@ -66,7 +66,7 @@
final Fingerprint oldFingerprint = Fingerprint.fromJson(fingerprintFile.readAsStringSync());
final Fingerprint newFingerprint = buildFingerprint();
return oldFingerprint == newFingerprint;
- } catch (e) {
+ } on Exception catch (e) {
// Log exception and continue, fingerprinting is only a performance improvement.
globals.printTrace('Fingerprint check error: $e');
}
@@ -77,7 +77,7 @@
try {
final Fingerprint fingerprint = buildFingerprint();
globals.fs.file(fingerprintPath).writeAsStringSync(fingerprint.toJson());
- } catch (e) {
+ } on Exception catch (e) {
// Log exception and continue, fingerprinting is only a performance improvement.
globals.printTrace('Fingerprint write error: $e');
}
@@ -103,7 +103,7 @@
final Iterable<File> files = inputPaths.map<File>(globals.fs.file);
final Iterable<File> missingInputs = files.where((File file) => !file.existsSync());
if (missingInputs.isNotEmpty) {
- throw ArgumentError('Missing input files:\n' + missingInputs.join('\n'));
+ throw Exception('Missing input files:\n' + missingInputs.join('\n'));
}
_checksums = <String, String>{};
@@ -116,14 +116,14 @@
/// Creates a Fingerprint from serialized JSON.
///
- /// Throws [ArgumentError], if there is a version mismatch between the
+ /// Throws [Exception], if there is a version mismatch between the
/// serializing framework and this framework.
Fingerprint.fromJson(String jsonData) {
final Map<String, dynamic> content = castStringKeyedMap(json.decode(jsonData));
final String version = content['version'] as String;
if (version != globals.flutterVersion.frameworkRevision) {
- throw ArgumentError('Incompatible fingerprint version: $version');
+ throw Exception('Incompatible fingerprint version: $version');
}
_checksums = castStringKeyedMap(content['files'])?.cast<String,String>() ?? <String, String>{};
_properties = castStringKeyedMap(content['properties'])?.cast<String,String>() ?? <String, String>{};
@@ -182,8 +182,11 @@
// outfile1 outfile2 : file1.dart file2.dart file3.dart
final String contents = globals.fs.file(depfilePath).readAsStringSync();
- final String dependencies = contents.split(': ')[1];
- return dependencies
+ final List<String> dependencies = contents.split(': ');
+ if (dependencies.length < 2) {
+ throw Exception('malformed depfile');
+ }
+ return dependencies[1]
.replaceAllMapped(_separatorExpr, (Match match) => '${match.group(1)}\n')
.split('\n')
.map<String>((String path) => path.replaceAllMapped(_escapeExpr, (Match match) => match.group(1)).trim())
diff --git a/packages/flutter_tools/lib/src/base/logger.dart b/packages/flutter_tools/lib/src/base/logger.dart
index 88256ca..0d92833 100644
--- a/packages/flutter_tools/lib/src/base/logger.dart
+++ b/packages/flutter_tools/lib/src/base/logger.dart
@@ -365,7 +365,8 @@
? message
: message.replaceAll('🔥', '')
.replaceAll('✗', 'X')
- .replaceAll('✓', '√');
+ .replaceAll('✓', '√')
+ .replaceAll('🔨', '');
_stdio.stdoutWrite(windowsMessage);
}
}
diff --git a/packages/flutter_tools/lib/src/base/os.dart b/packages/flutter_tools/lib/src/base/os.dart
index 65c8b5a..099a71f 100644
--- a/packages/flutter_tools/lib/src/base/os.dart
+++ b/packages/flutter_tools/lib/src/base/os.dart
@@ -136,7 +136,7 @@
return findFreePort(ipv6: true);
}
_logger.printTrace('findFreePort failed: $e');
- } catch (e) {
+ } on Exception catch (e) {
// Failures are signaled by a return value of 0 from this function.
_logger.printTrace('findFreePort failed: $e');
} finally {
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index d8b5d74..eddf2c5 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -367,7 +367,7 @@
stdioFuture = stdioFuture.timeout(const Duration(seconds: 1));
}
await stdioFuture;
- } catch (_) {
+ } on Exception catch (_) {
// Ignore errors on the process' stdout and stderr streams. Just capture
// whatever we got, and use the exit code
}
@@ -539,7 +539,7 @@
_traceCommand(cli);
try {
return _processManager.runSync(cli, environment: environment).exitCode == 0;
- } catch (error) {
+ } on Exception catch (error) {
_logger.printTrace('$cli failed with $error');
return false;
}
@@ -553,7 +553,7 @@
_traceCommand(cli);
try {
return (await _processManager.run(cli, environment: environment)).exitCode == 0;
- } catch (error) {
+ } on Exception catch (error) {
_logger.printTrace('$cli failed with $error');
return false;
}
diff --git a/packages/flutter_tools/lib/src/base/signals.dart b/packages/flutter_tools/lib/src/base/signals.dart
index 28b9e67..dbbbd76 100644
--- a/packages/flutter_tools/lib/src/base/signals.dart
+++ b/packages/flutter_tools/lib/src/base/signals.dart
@@ -117,7 +117,7 @@
for (final SignalHandler handler in _handlersList[s]) {
try {
await asyncGuard<void>(() async => handler(s));
- } catch (e) {
+ } on Exception catch (e) {
if (_errorStreamController.hasListener) {
_errorStreamController.add(e);
}
diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart
index c777a6f..cd86e41 100644
--- a/packages/flutter_tools/lib/src/build_info.dart
+++ b/packages/flutter_tools/lib/src/build_info.dart
@@ -399,8 +399,7 @@
case 'x86_64':
return DarwinArch.x86_64;
}
- assert(false);
- return null;
+ throw Exception('Unsupported iOS arch name "$arch"');
}
String getNameForTargetPlatform(TargetPlatform platform, {DarwinArch darwinArch}) {
@@ -481,8 +480,7 @@
case 'android-x86':
return AndroidArch.x86;
}
- assert(false);
- return null;
+ throw Exception('Unsupported Android arch name "$platform"');
}
String getNameForAndroidArch(AndroidArch arch) {
diff --git a/packages/flutter_tools/lib/src/build_system/build_system.dart b/packages/flutter_tools/lib/src/build_system/build_system.dart
index 18c2e0f..3a27b52 100644
--- a/packages/flutter_tools/lib/src/build_system/build_system.dart
+++ b/packages/flutter_tools/lib/src/build_system/build_system.dart
@@ -582,7 +582,7 @@
previousFile.deleteSync();
}
}
- } catch (exception, stackTrace) {
+ } on Exception catch (exception, stackTrace) {
// TODO(jonahwilliams): throw specific exception for expected errors to mark
// as non-fatal. All others should be fatal.
node.target.clearStamp(environment);
diff --git a/packages/flutter_tools/lib/src/build_system/file_hash_store.dart b/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
index b1b679e..ecd3d48 100644
--- a/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
+++ b/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
@@ -115,8 +115,8 @@
FileStorage fileStorage;
try {
fileStorage = FileStorage.fromBuffer(data);
- } catch (err) {
- _logger.printTrace('Filestorage format changed');
+ } on Exception catch (err) {
+ _logger.printTrace('Filestorage format changed: $err');
cacheFile.deleteSync();
return;
}
diff --git a/packages/flutter_tools/lib/src/build_system/targets/ios.dart b/packages/flutter_tools/lib/src/build_system/targets/ios.dart
index 977aae1..990716c 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/ios.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/ios.dart
@@ -376,8 +376,8 @@
Future<RunResult> createStubAppFramework(File outputFile, SdkType sdk, { bool include32Bit = true }) async {
try {
outputFile.createSync(recursive: true);
- } catch (e) {
- throwToolExit('Failed to create App.framework stub at ${outputFile.path}');
+ } on Exception catch (e) {
+ throwToolExit('Failed to create App.framework stub at ${outputFile.path}: $e');
}
final Directory tempDir = globals.fs.systemTempDirectory.createTempSync('flutter_tools_stub_source.');
@@ -420,8 +420,8 @@
tempDir.deleteSync(recursive: true);
} on FileSystemException catch (_) {
// Best effort. Sometimes we can't delete things from system temp.
- } catch (e) {
- throwToolExit('Failed to create App.framework stub at ${outputFile.path}');
+ } on Exception catch (e) {
+ throwToolExit('Failed to create App.framework stub at ${outputFile.path}: $e');
}
}
}
diff --git a/packages/flutter_tools/lib/src/build_system/targets/macos.dart b/packages/flutter_tools/lib/src/build_system/targets/macos.dart
index c2b3531..a4d5c9d 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/macos.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/macos.dart
@@ -331,7 +331,7 @@
try {
final File sourceFile = environment.buildDir.childFile('app.dill');
sourceFile.copySync(assetDirectory.childFile('kernel_blob.bin').path);
- } catch (err) {
+ } on Exception catch (err) {
throw Exception('Failed to copy app.dill: $err');
}
// Copy precompiled runtimes.
@@ -344,7 +344,7 @@
assetDirectory.childFile('vm_snapshot_data').path);
globals.fs.file(isolateSnapshotData).copySync(
assetDirectory.childFile('isolate_snapshot_data').path);
- } catch (err) {
+ } on Exception catch (err) {
throw Exception('Failed to copy precompiled runtimes: $err');
}
}
diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index bfbde09..34c5990 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -403,7 +403,7 @@
if (!cachedFile.existsSync()) {
try {
await downloadFile(url, cachedFile);
- } catch (e) {
+ } on Exception catch (e) {
throwToolExit('Failed to fetch third-party artifact $url: $e');
}
}
@@ -597,7 +597,8 @@
try {
await cache.downloadFile(url, tempFile);
status.stop();
- } catch (exception) {
+ // The exception is rethrown, so don't catch only Exceptions.
+ } catch (exception) { // ignore: avoid_catches_without_on_clauses
status.cancel();
rethrow;
}
diff --git a/packages/flutter_tools/lib/src/commands/analyze_base.dart b/packages/flutter_tools/lib/src/commands/analyze_base.dart
index 63fb3dc..2190d80 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_base.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_base.dart
@@ -33,7 +33,7 @@
} finally {
resultsFile.close();
}
- } catch (e) {
+ } on Exception catch (e) {
globals.printError('Failed to save output to "${argResults['write']}": $e');
}
}
diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart
index 4dac90e..4a0a018 100644
--- a/packages/flutter_tools/lib/src/commands/assemble.dart
+++ b/packages/flutter_tools/lib/src/commands/assemble.dart
@@ -104,7 +104,7 @@
CustomDimensions.commandBuildBundleTargetPlatform: localEnvironment.defines['TargetPlatform'],
CustomDimensions.commandBuildBundleIsModule: '${futterProject.isModule}',
};
- } catch (err) {
+ } on Exception {
// We've failed to send usage.
}
return const <CustomDimensions, String>{};
diff --git a/packages/flutter_tools/lib/src/commands/attach.dart b/packages/flutter_tools/lib/src/commands/attach.dart
index a1f8530..941ad3b 100644
--- a/packages/flutter_tools/lib/src/commands/attach.dart
+++ b/packages/flutter_tools/lib/src/commands/attach.dart
@@ -114,7 +114,7 @@
}
try {
return int.parse(stringArg('debug-port'));
- } catch (error) {
+ } on Exception catch (error) {
throwToolExit('Invalid port for `--debug-port`: $error');
}
return null;
@@ -222,7 +222,7 @@
try {
isolateDiscoveryProtocol = device.getIsolateDiscoveryProtocol(module);
observatoryUri = Stream<Uri>.value(await isolateDiscoveryProtocol.uri).asBroadcastStream();
- } catch (_) {
+ } on Exception {
isolateDiscoveryProtocol?.dispose();
final List<ForwardedPort> ports = device.portForwarder.forwardedPorts.toList();
for (final ForwardedPort port in ports) {
@@ -292,7 +292,7 @@
globals.fs.currentDirectory,
LaunchMode.attach,
);
- } catch (error) {
+ } on Exception catch (error) {
throwToolExit(error.toString());
}
result = await app.runner.waitForAppToFinish();
diff --git a/packages/flutter_tools/lib/src/commands/clean.dart b/packages/flutter_tools/lib/src/commands/clean.dart
index da967b0..a352261 100644
--- a/packages/flutter_tools/lib/src/commands/clean.dart
+++ b/packages/flutter_tools/lib/src/commands/clean.dart
@@ -71,7 +71,7 @@
for (final String scheme in projectInfo.schemes) {
await xcodeProjectInterpreter.cleanWorkspace(xcodeWorkspace.path, scheme);
}
- } catch (error) {
+ } on Exception catch (error) {
globals.printTrace('Could not clean Xcode workspace: $error');
} finally {
xcodeStatus?.stop();
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index ea1c3c2..6bb780e 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -264,7 +264,7 @@
outputFile.writeAsStringSync(samplesJson);
globals.printStatus('Wrote samples JSON to "$outputFilePath"');
}
- } catch (e) {
+ } on Exception catch (e) {
throwToolExit('Failed to write samples JSON to "$outputFilePath": $e', exitCode: 2);
}
}
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index 9427164..a7825f6 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -175,7 +175,7 @@
completer.complete(request['result']);
}
}
- } catch (error, trace) {
+ } on Exception catch (error, trace) {
_send(<String, dynamic>{
'id': id,
'error': _toJsonable(error),
@@ -414,7 +414,7 @@
return <String, Object>{
'platforms': result,
};
- } catch (err, stackTrace) {
+ } on Exception catch (err, stackTrace) {
sendEvent('log', <String, dynamic>{
'log': 'Failed to parse project metadata',
'stackTrace': stackTrace.toString(),
@@ -596,7 +596,7 @@
appStartedCompleter: appStartedCompleter,
);
_sendAppEvent(app, 'stop');
- } catch (error, trace) {
+ } on Exception catch (error, trace) {
_sendAppEvent(app, 'stop', <String, dynamic>{
'error': _toJsonable(error),
'trace': '$trace',
@@ -780,7 +780,7 @@
try {
final Map<String, Object> response = await _deviceToMap(device);
sendEvent(eventName, response);
- } catch (err) {
+ } on Exception catch (err) {
globals.printError('$err');
}
});
diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart
index 6ea5281..3b5fd1d 100644
--- a/packages/flutter_tools/lib/src/commands/drive.dart
+++ b/packages/flutter_tools/lib/src/commands/drive.dart
@@ -261,7 +261,7 @@
try {
await window.setLocation(const math.Point<int>(0, 0));
await window.setSize(math.Rectangle<int>(0, 0, x, y));
- } catch (_) {
+ } on Exception {
// Error might be thrown in some browsers.
}
@@ -278,7 +278,7 @@
try {
await testRunner(<String>[testFile], environment);
- } catch (error, stackTrace) {
+ } on Exception catch (error, stackTrace) {
if (error is ToolExit) {
rethrow;
}
diff --git a/packages/flutter_tools/lib/src/commands/generate.dart b/packages/flutter_tools/lib/src/commands/generate.dart
index 3f94441..c124182 100644
--- a/packages/flutter_tools/lib/src/commands/generate.dart
+++ b/packages/flutter_tools/lib/src/commands/generate.dart
@@ -52,8 +52,8 @@
globals.printError(stackData[0] as String);
globals.printError(stackData[1] as String);
globals.printError(StackTrace.fromString(stackData[2] as String).toString());
- } catch (err) {
- globals.printError('Error reading error in ${errorFile.path}');
+ } on Exception catch (err) {
+ globals.printError('Error reading error in ${errorFile.path}: $err');
}
}
return FlutterCommandResult.fail();
diff --git a/packages/flutter_tools/lib/src/commands/packages.dart b/packages/flutter_tools/lib/src/commands/packages.dart
index b36fbf5..0a7e76b 100644
--- a/packages/flutter_tools/lib/src/commands/packages.dart
+++ b/packages/flutter_tools/lib/src/commands/packages.dart
@@ -98,7 +98,8 @@
);
pubGetTimer.stop();
flutterUsage.sendTiming('pub', 'get', pubGetTimer.elapsed, label: 'success');
- } catch (_) {
+ // Not limiting to catching Exception because the exception is rethrown.
+ } catch (_) { // ignore: avoid_catches_without_on_clauses
pubGetTimer.stop();
flutterUsage.sendTiming('pub', 'get', pubGetTimer.elapsed, label: 'failure');
rethrow;
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 15fa50a..0c3a8f0 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -420,7 +420,7 @@
dillOutputPath: stringArg('output-dill'),
ipv6: ipv6,
);
- } catch (error) {
+ } on Exception catch (error) {
throwToolExit(error.toString());
}
final DateTime appStartedTime = systemClock.now();
diff --git a/packages/flutter_tools/lib/src/commands/screenshot.dart b/packages/flutter_tools/lib/src/commands/screenshot.dart
index a64d1cc..5d830e7 100644
--- a/packages/flutter_tools/lib/src/commands/screenshot.dart
+++ b/packages/flutter_tools/lib/src/commands/screenshot.dart
@@ -116,7 +116,7 @@
);
try {
await device.takeScreenshot(outputFile);
- } catch (error) {
+ } on Exception catch (error) {
throwToolExit('Error taking screenshot: $error');
}
_showOutputFileInfo(outputFile);
diff --git a/packages/flutter_tools/lib/src/commands/unpack.dart b/packages/flutter_tools/lib/src/commands/unpack.dart
index 07587d6..885c4dd 100644
--- a/packages/flutter_tools/lib/src/commands/unpack.dart
+++ b/packages/flutter_tools/lib/src/commands/unpack.dart
@@ -150,7 +150,7 @@
} else {
globals.printTrace('Artifacts for version $targetHash already present.');
}
- } catch (error, stackTrace) {
+ } on Exception catch (error, stackTrace) {
globals.printError(stackTrace.toString());
globals.printError(error.toString());
return false;
@@ -200,8 +200,8 @@
}
globals.printTrace('Copied artifacts from $sourceDirectory.');
- } catch (e, stackTrace) {
- globals.printError(e.message as String);
+ } on Exception catch (e, stackTrace) {
+ globals.printError(e.toString());
globals.printError(stackTrace.toString());
return false;
}
diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart
index d423513..840e265 100644
--- a/packages/flutter_tools/lib/src/commands/upgrade.dart
+++ b/packages/flutter_tools/lib/src/commands/upgrade.dart
@@ -210,7 +210,7 @@
throwOnError: true,
workingDirectory: workingDirectory,
);
- } catch (e) {
+ } on Exception {
throwToolExit(
'Unable to upgrade Flutter: no origin repository configured. '
"Run 'git remote add origin "
@@ -279,7 +279,7 @@
final FlutterVersion newFlutterVersion = FlutterVersion(const SystemClock(), workingDirectory);
alreadyUpToDate = newFlutterVersion.channel == oldFlutterVersion.channel &&
newFlutterVersion.frameworkRevision == oldFlutterVersion.frameworkRevision;
- } catch (e) {
+ } on Exception catch (e) {
globals.printTrace('Failed to determine FlutterVersion after upgrade fast-forward: $e');
}
return alreadyUpToDate;
diff --git a/packages/flutter_tools/lib/src/commands/version.dart b/packages/flutter_tools/lib/src/commands/version.dart
index 4d715a9..b5fff30 100644
--- a/packages/flutter_tools/lib/src/commands/version.dart
+++ b/packages/flutter_tools/lib/src/commands/version.dart
@@ -116,8 +116,8 @@
throwOnError: true,
workingDirectory: Cache.flutterRoot,
);
- } catch (e) {
- throwToolExit('Unable to checkout version branch for version $version.');
+ } on Exception catch (e) {
+ throwToolExit('Unable to checkout version branch for version $version: $e');
}
final FlutterVersion flutterVersion = FlutterVersion();
diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart
index ff0ef4c..10ae1b9 100644
--- a/packages/flutter_tools/lib/src/dart/pub.dart
+++ b/packages/flutter_tools/lib/src/dart/pub.dart
@@ -180,7 +180,8 @@
retry: true,
);
status.stop();
- } catch (exception) {
+ // The exception is rethrown, so don't catch only Exceptions.
+ } catch (exception) { // ignore: avoid_catches_without_on_clauses
status.cancel();
rethrow;
}
@@ -322,7 +323,7 @@
globals.stdio.addStdoutStream(process.stdout),
globals.stdio.addStderrStream(process.stderr),
]);
- } catch (err, stack) {
+ } on Exception catch (err, stack) {
globals.printTrace('Echoing stdout or stderr from the pub subprocess failed:');
globals.printTrace('$err\n$stack');
}
diff --git a/packages/flutter_tools/lib/src/desktop_device.dart b/packages/flutter_tools/lib/src/desktop_device.dart
index 9250f5d..fd3d0df 100644
--- a/packages/flutter_tools/lib/src/desktop_device.dart
+++ b/packages/flutter_tools/lib/src/desktop_device.dart
@@ -116,7 +116,7 @@
final Uri observatoryUri = await observatoryDiscovery.uri;
onAttached(package, buildMode, process);
return LaunchResult.succeeded(observatoryUri: observatoryUri);
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('Error waiting for a debug connection: $error');
return LaunchResult.failed();
} finally {
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index b985bff..3a8be95 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -238,7 +238,7 @@
List<int> bytes;
try {
bytes = await content.contentsAsBytes();
- } catch (e) {
+ } on Exception catch (e) {
return e;
}
final String fileContents = base64.encode(bytes);
@@ -251,7 +251,7 @@
'fileContents': fileContents,
},
);
- } catch (error) {
+ } on Exception catch (error) {
globals.printTrace('DevFS: Failed to write $deviceUri: $error');
}
}
@@ -319,7 +319,7 @@
onError: (dynamic error) { globals.printTrace('error: $error'); },
cancelOnError: true);
break;
- } catch (error, trace) {
+ } on Exception catch (error, trace) {
if (!_completer.isCompleted) {
globals.printTrace('Error writing "$deviceUri" to DevFS: $error');
if (retry > 0) {
@@ -527,7 +527,7 @@
} on SocketException catch (socketException, stackTrace) {
globals.printTrace('DevFS sync failed. Lost connection to device: $socketException');
throw DevFSException('Lost connection to device.', socketException, stackTrace);
- } catch (exception, stackTrace) {
+ } on Exception catch (exception, stackTrace) {
globals.printError('Could not update files on device: $exception');
throw DevFSException('Sync failed', exception, stackTrace);
}
diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart
index 3a228fd..4a8ab5b 100644
--- a/packages/flutter_tools/lib/src/doctor.dart
+++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -198,7 +198,7 @@
ValidationResult result;
try {
result = await asyncGuard<ValidationResult>(() => validator.validate());
- } catch (exception) {
+ } on Exception catch (exception) {
// We're generating a summary, so drop the stack trace.
result = ValidationResult.crash(exception);
}
@@ -280,10 +280,10 @@
ValidationResult result;
try {
result = await validatorTask.result;
- } catch (exception, stackTrace) {
- result = ValidationResult.crash(exception, stackTrace);
- } finally {
status.stop();
+ } on Exception catch (exception, stackTrace) {
+ result = ValidationResult.crash(exception, stackTrace);
+ status.cancel();
}
switch (result.type) {
@@ -437,7 +437,7 @@
_currentSlowWarning = subValidator.validator.slowWarning;
try {
results.add(await subValidator.result);
- } catch (exception, stackTrace) {
+ } on Exception catch (exception, stackTrace) {
results.add(ValidationResult.crash(exception, stackTrace));
}
}
@@ -667,7 +667,7 @@
const int kExpectedExitCode = 255;
try {
return processUtils.runSync(<String>[genSnapshotPath]).exitCode == kExpectedExitCode;
- } catch (error) {
+ } on Exception {
return false;
}
}
@@ -795,7 +795,7 @@
String installPath;
try {
installPath = globals.fs.file(globals.fs.path.join(dir.path, 'system', '.home')).readAsStringSync();
- } catch (e) {
+ } on Exception {
// ignored
}
if (installPath != null && globals.fs.isDirectorySync(installPath)) {
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
index 3efe09a..9dfb52f 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -271,7 +271,7 @@
packageRepo.deleteSync(recursive: true);
}
packageRepo.createSync(recursive: true);
- } catch (e) {
+ } on Exception catch (e) {
globals.printError('Failed to create Fuchisa package repo directory '
'at ${packageRepo.path}: $e');
return LaunchResult.failed();
@@ -384,7 +384,7 @@
globals.printTrace("Removing the tool's package repo: at ${packageRepo.path}");
try {
packageRepo.deleteSync(recursive: true);
- } catch (e) {
+ } on Exception catch (e) {
globals.printError('Failed to remove Fuchsia package repo directory '
'at ${packageRepo.path}: $e.');
}
@@ -467,9 +467,9 @@
'Failed to delete screenshot.ppm from the device:\n$deleteResult'
);
}
- } catch (_) {
+ } on Exception catch (e) {
globals.printError(
- 'Failed to delete screenshot.ppm from the device'
+ 'Failed to delete screenshot.ppm from the device: $e'
);
}
}
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
index 628e624..59fc738 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_sdk.dart
@@ -92,7 +92,7 @@
.transform(const LineSplitter()));
});
return controller.stream;
- } catch (exception) {
+ } on Exception catch (exception) {
globals.printTrace('$exception');
}
return const Stream<String>.empty();
diff --git a/packages/flutter_tools/lib/src/intellij/intellij.dart b/packages/flutter_tools/lib/src/intellij/intellij.dart
index 48a9a50..a976c0d 100644
--- a/packages/flutter_tools/lib/src/intellij/intellij.dart
+++ b/packages/flutter_tools/lib/src/intellij/intellij.dart
@@ -67,7 +67,7 @@
final int start = content.indexOf(versionStartTag);
final int end = content.indexOf('</version>', start);
return content.substring(start + versionStartTag.length, end);
- } catch (_) {
+ } on Exception {
return null;
}
}
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index 6cdea04..3d30292 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -448,7 +448,7 @@
}
}
return utf8.decode(out);
- } catch (_) {
+ } on Exception {
// Unable to decode line: return as-is.
return line;
}
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart
index d9f8fe3..44a688b 100644
--- a/packages/flutter_tools/lib/src/ios/simulators.dart
+++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -291,7 +291,7 @@
final IOSApp iosApp = app;
await SimControl.instance.install(id, iosApp.simulatorBundlePath);
return true;
- } catch (e) {
+ } on Exception {
return false;
}
}
@@ -301,7 +301,7 @@
try {
await SimControl.instance.uninstall(id, app.id);
return true;
- } catch (e) {
+ } on Exception {
return false;
}
}
@@ -395,7 +395,7 @@
final String bundleIdentifier = globals.plistParser.getValueFromFile(plistPath, PlistParser.kCFBundleIdentifierKey);
await SimControl.instance.launch(id, bundleIdentifier, args);
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('$error');
return LaunchResult.failed();
}
@@ -411,7 +411,7 @@
try {
final Uri deviceUri = await observatoryDiscovery.uri;
return LaunchResult.succeeded(observatoryUri: deviceUri);
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('Error waiting for a debug connection: $error');
return LaunchResult.failed();
} finally {
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
index dc9bbbb..e5bc9dd 100644
--- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -349,7 +349,7 @@
);
final String out = result.stdout.trim();
return parseXcodeBuildSettings(out);
- } catch(error) {
+ } on Exception catch (error) {
if (error is ProcessException && error.toString().contains('timed out')) {
BuildEvent('xcode-show-build-settings-timeout',
command: showBuildSettingsCommand.join(' '),
diff --git a/packages/flutter_tools/lib/src/macos/xcode.dart b/packages/flutter_tools/lib/src/macos/xcode.dart
index 55d22dc..936a589 100644
--- a/packages/flutter_tools/lib/src/macos/xcode.dart
+++ b/packages/flutter_tools/lib/src/macos/xcode.dart
@@ -406,11 +406,15 @@
final String architecture = deviceProperties['architecture'] as String;
try {
cpuArchitecture = getIOSArchForName(architecture);
- } catch (error) {
- // Fallback to default iOS architecture. Future-proof against a theoretical version
- // of Xcode that changes this string to something slightly different like "ARM64".
+ } on Exception {
+ // Fallback to default iOS architecture. Future-proof against a
+ // theoretical version of Xcode that changes this string to something
+ // slightly different like "ARM64".
cpuArchitecture ??= defaultIOSArchs.first;
- _logger.printError('Unknown architecture $architecture, defaulting to ${getNameForDarwinArch(cpuArchitecture)}');
+ _logger.printError(
+ 'Unknown architecture $architecture, defaulting to '
+ '${getNameForDarwinArch(cpuArchitecture)}',
+ );
}
}
return cpuArchitecture;
diff --git a/packages/flutter_tools/lib/src/reporting/crash_reporting.dart b/packages/flutter_tools/lib/src/reporting/crash_reporting.dart
index 466ba63..1bffbf7 100644
--- a/packages/flutter_tools/lib/src/reporting/crash_reporting.dart
+++ b/packages/flutter_tools/lib/src/reporting/crash_reporting.dart
@@ -126,7 +126,9 @@
} else {
globals.printError('Failed to send crash report. Server responded with HTTP status code ${resp.statusCode}');
}
- } catch (sendError, sendStackTrace) {
+ // Catch all exceptions to print the message that makes clear that the
+ // crash logger crashed.
+ } catch (sendError, sendStackTrace) { // ignore: avoid_catches_without_on_clauses
if (sendError is SocketException || sendError is HttpException) {
globals.printError('Failed to send crash report due to a network error: $sendError');
} else {
diff --git a/packages/flutter_tools/lib/src/reporting/events.dart b/packages/flutter_tools/lib/src/reporting/events.dart
index 3bf8139..4696550 100644
--- a/packages/flutter_tools/lib/src/reporting/events.dart
+++ b/packages/flutter_tools/lib/src/reporting/events.dart
@@ -195,7 +195,7 @@
label: parameter,
value: maxRss,
);
- } catch (error) {
+ } on Exception catch (error) {
// If grabbing the maxRss fails for some reason, just don't send an event.
globals.printTrace('Querying maxRss failed with error: $error');
}
diff --git a/packages/flutter_tools/lib/src/reporting/github_template.dart b/packages/flutter_tools/lib/src/reporting/github_template.dart
index f607a5b..5d958b7 100644
--- a/packages/flutter_tools/lib/src/reporting/github_template.dart
+++ b/packages/flutter_tools/lib/src/reporting/github_template.dart
@@ -136,7 +136,7 @@
} else {
globals.printTrace('Failed to shorten GitHub template URL. Server responded with HTTP status code ${response.statusCode}');
}
- } catch (sendError) {
+ } on Exception catch (sendError) {
globals.printTrace('Failed to shorten GitHub template URL: $sendError');
}
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index ab04d82..6974398 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -875,7 +875,7 @@
for (final FlutterView view in device.views) {
await view.uiIsolate.flutterDebugAllowBanner(false);
}
- } catch (error) {
+ } on Exception catch (error) {
status.cancel();
globals.printError('Error communicating with Flutter on the device: $error');
return;
@@ -889,7 +889,7 @@
for (final FlutterView view in device.views) {
await view.uiIsolate.flutterDebugAllowBanner(true);
}
- } catch (error) {
+ } on Exception catch (error) {
status.cancel();
globals.printError('Error communicating with Flutter on the device: $error');
return;
@@ -901,7 +901,7 @@
globals.printStatus(
'Screenshot written to ${globals.fs.path.relative(outputFile.path)} (${sizeKB}kB).',
);
- } catch (error) {
+ } on Exception catch (error) {
status.cancel();
globals.printError('Error taking screenshot: $error');
}
@@ -1303,7 +1303,8 @@
try {
lastReceivedCommand = command;
await _commonTerminalInputHandler(command);
- } catch (error, st) {
+ // Catch all exception since this is doing cleanup and rethrowing.
+ } catch (error, st) { // ignore: avoid_catches_without_on_clauses
// Don't print stack traces for known error types.
if (error is! ToolExit) {
globals.printError('$error\n$st');
diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart
index 6dbc7d6..49387c1 100644
--- a/packages/flutter_tools/lib/src/run_cold.dart
+++ b/packages/flutter_tools/lib/src/run_cold.dart
@@ -131,7 +131,7 @@
_didAttach = true;
try {
await connectToServiceProtocol();
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('Error connecting to the service protocol: $error');
// https://github.com/flutter/flutter/issues/33050
// TODO(blasten): Remove this check once https://issuetracker.google.com/issues/132325318 has been fixed.
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index 95a4fb5..ac64549 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -186,7 +186,7 @@
final Map<String, dynamic> firstReport = reports.first;
await device.updateReloadStatus(validateReloadReport(firstReport, printErrors: false));
}
- } catch (error) {
+ } on Exception catch (error) {
return OperationResult(1, error.toString());
}
@@ -215,14 +215,25 @@
compileExpression: _compileExpressionService,
reloadMethod: reloadMethod,
);
- } catch (error) {
+ // Catches all exceptions, non-Exception objects are rethrown.
+ } catch (error) { // ignore: avoid_catches_without_on_clauses
+ if (error is! Exception && error is! String) {
+ rethrow;
+ }
globals.printError('Error connecting to the service protocol: $error');
// https://github.com/flutter/flutter/issues/33050
- // TODO(blasten): Remove this check once https://issuetracker.google.com/issues/132325318 has been fixed.
+ // TODO(blasten): Remove this check once
+ // https://issuetracker.google.com/issues/132325318 has been fixed.
if (await hasDeviceRunningAndroidQ(flutterDevices) &&
error.toString().contains(kAndroidQHttpConnectionClosedExp)) {
- globals.printStatus('🔨 If you are using an emulator running Android Q Beta, consider using an emulator running API level 29 or lower.');
- globals.printStatus('Learn more about the status of this issue on https://issuetracker.google.com/issues/132325318.');
+ globals.printStatus(
+ '🔨 If you are using an emulator running Android Q Beta, '
+ 'consider using an emulator running API level 29 or lower.',
+ );
+ globals.printStatus(
+ 'Learn more about the status of this issue on '
+ 'https://issuetracker.google.com/issues/132325318.',
+ );
}
return 2;
}
@@ -242,7 +253,7 @@
),
);
}
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('Error initializing DevFS: $error');
return 3;
}
@@ -872,7 +883,7 @@
return OperationResult(errorCode, errorMessage);
}
return OperationResult(errorCode, '$errorMessage (error code: $errorCode)');
- } catch (error, stackTrace) {
+ } on Exception catch (error, stackTrace) {
globals.printTrace('Hot reload failed: $error\n$stackTrace');
return OperationResult(1, '$error');
}
@@ -936,7 +947,7 @@
() async {
try {
await view.uiIsolate.flutterReassemble();
- } catch (error) {
+ } on Exception catch (error) {
failedReassemble = true;
globals.printError('Reassembling ${view.uiIsolate.name} failed: $error');
return;
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
index 4ce44f3..8342289 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -8,6 +8,7 @@
import 'package:args/command_runner.dart';
import 'package:completion/completion.dart';
import 'package:file/file.dart';
+import 'package:meta/meta.dart';
import '../artifacts.dart';
import '../base/common.dart';
@@ -189,7 +190,7 @@
if (script.contains('flutter/examples/')) {
return script.substring(0, script.indexOf('flutter/examples/') + 8);
}
- } catch (error) {
+ } on Exception catch (error) {
// we don't have a logger at the time this is run
// (which is why we don't use printTrace here)
print(userMessages.runnerNoRoot('$error'));
@@ -421,6 +422,7 @@
return EngineBuildPaths(targetEngine: engineBuildPath, hostEngine: engineHostBuildPath);
}
+ @visibleForTesting
static void initFlutterRoot() {
Cache.flutterRoot ??= defaultFlutterRoot;
}
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index 1e78e9e..025a455 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -313,7 +313,7 @@
final RunnerSuiteController controller = deserializeSuite(path, platform,
suiteConfig, const PluginEnvironment(), channel, message);
return await controller.suite;
- } catch (err) {
+ } on Exception catch (err) {
/// Rethrow a less confusing error if it is a test incompatibility.
if (err.toString().contains("type 'Declarer' is not a subtype of type 'Declarer'")) {
throw UnsupportedError('Package incompatibility between flutter and test packages:\n'
@@ -667,7 +667,7 @@
}
break;
}
- } catch (error, stack) {
+ } on Exception catch (error, stack) {
globals.printTrace('test $ourTestCount: error caught during test; ${controllerSinkClosed ? "reporting to console" : "sending to test framework"}');
if (!controllerSinkClosed) {
controller.sink.addError(error, stack);
@@ -681,7 +681,7 @@
for (final Finalizer finalizer in finalizers.reversed) {
try {
await finalizer();
- } catch (error, stack) {
+ } on Exception catch (error, stack) {
globals.printTrace('test $ourTestCount: error while cleaning up; ${controllerSinkClosed ? "reporting to console" : "sending to test framework"}');
if (!controllerSinkClosed) {
controller.sink.addError(error, stack);
@@ -873,7 +873,7 @@
if (reportObservatoryUri != null) {
reportObservatoryUri(uri);
}
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('Could not parse shell observatory port message: $error');
}
} else if (line != null) {
diff --git a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
index 93c26f7..9434a45 100644
--- a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
@@ -743,7 +743,8 @@
_controllers.add(controller);
return await controller.suite;
- } catch (_) {
+ // Not limiting to catching Exception because the exception is rethrown.
+ } catch (_) { // ignore: avoid_catches_without_on_clauses
closeIframe();
rethrow;
}
@@ -997,7 +998,7 @@
try {
bool success = await goldenFileComparator.compare(bytes, goldenKey);
print(jsonEncode({'success': success}));
- } catch (ex) {
+ } on Exception catch (ex) {
print(jsonEncode({'success': false, 'message': '\$ex'}));
}
}
diff --git a/packages/flutter_tools/lib/src/tester/flutter_tester.dart b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
index bd90c60..19cea0f 100644
--- a/packages/flutter_tools/lib/src/tester/flutter_tester.dart
+++ b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
@@ -194,7 +194,7 @@
final Uri observatoryUri = await observatoryDiscovery.uri;
return LaunchResult.succeeded(observatoryUri: observatoryUri);
- } catch (error) {
+ } on Exception catch (error) {
globals.printError('Failed to launch $package: $error');
return LaunchResult.failed();
}
diff --git a/packages/flutter_tools/lib/src/tracing.dart b/packages/flutter_tools/lib/src/tracing.dart
index 020d068..25402b8 100644
--- a/packages/flutter_tools/lib/src/tracing.dart
+++ b/packages/flutter_tools/lib/src/tracing.dart
@@ -60,7 +60,8 @@
if (!done) {
await whenFirstFrameRendered.future;
}
- } catch (exception) {
+ // The exception is rethrown, so don't catch only Exceptions.
+ } catch (exception) { // ignore: avoid_catches_without_on_clauses
status.cancel();
rethrow;
}
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart
index 8a87986..03ab5de 100644
--- a/packages/flutter_tools/lib/src/version.dart
+++ b/packages/flutter_tools/lib/src/version.dart
@@ -528,7 +528,7 @@
} else {
globals.printTrace('Warning: expected version stamp to be a Map but found: $jsonObject');
}
- } catch (error, stackTrace) {
+ } on Exception catch (error, stackTrace) {
// Do not crash if JSON is malformed.
globals.printTrace('${error.runtimeType}: $error\n$stackTrace');
}
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index f18f802..db9f783 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -145,7 +145,7 @@
return <String, String>{'type': 'Success'};
} on rpc.RpcException {
rethrow;
- } catch (e, st) {
+ } on Exception catch (e, st) {
throw rpc.RpcException(rpc_error_code.SERVER_ERROR,
'Error during Sources Reload: $e\n$st');
}
@@ -189,7 +189,7 @@
return <String, String>{'type': 'Success'};
} on rpc.RpcException {
rethrow;
- } catch (e, st) {
+ } on Exception catch (e, st) {
throw rpc.RpcException(rpc_error_code.SERVER_ERROR,
'Error during Sources Reload: $e\n$st');
}
@@ -213,7 +213,7 @@
return <String, String>{'type': 'Success'};
} on rpc.RpcException {
rethrow;
- } catch (e, st) {
+ } on Exception catch (e, st) {
throw rpc.RpcException(rpc_error_code.SERVER_ERROR,
'Error during Hot Restart: $e\n$st');
}
@@ -266,7 +266,7 @@
'result': <String, dynamic> {'kernelBytes': kernelBytesBase64}};
} on rpc.RpcException {
rethrow;
- } catch (e, st) {
+ } on Exception catch (e, st) {
throw rpc.RpcException(rpc_error_code.SERVER_ERROR,
'Error during expression compilation: $e\n$st');
}
@@ -625,7 +625,8 @@
updateFromMap(response);
completer.complete(this);
}
- } catch (e, st) {
+ // Catches all exceptions to propagate to the completer.
+ } catch (e, st) { // ignore: avoid_catches_without_on_clauses
completer.completeError(e, st);
}
_inProgressReload = null;
diff --git a/packages/flutter_tools/lib/src/web/chrome.dart b/packages/flutter_tools/lib/src/web/chrome.dart
index f285496..19166da 100644
--- a/packages/flutter_tools/lib/src/web/chrome.dart
+++ b/packages/flutter_tools/lib/src/web/chrome.dart
@@ -211,7 +211,7 @@
if (!skipCheck) {
try {
await chrome.chromeConnection.getTabs();
- } catch (e) {
+ } on Exception catch (e) {
await chrome.close();
throwToolExit(
'Unable to connect to Chrome debug port: ${chrome.debugPort}\n $e');
@@ -235,7 +235,7 @@
final HttpClientResponse response = await request.close();
final List<dynamic> jsonObject = await json.fuse(utf8).decoder.bind(response).single as List<dynamic>;
return base.resolve(jsonObject.first['devtoolsFrontendUrl'] as String);
- } catch (_) {
+ } on Exception {
// If we fail to talk to the remote debugger protocol, give up and return
// the raw URL rather than crashing.
return base;
diff --git a/packages/flutter_tools/lib/src/web/compile.dart b/packages/flutter_tools/lib/src/web/compile.dart
index 15a1f6e..e75471a 100644
--- a/packages/flutter_tools/lib/src/web/compile.dart
+++ b/packages/flutter_tools/lib/src/web/compile.dart
@@ -66,7 +66,7 @@
}
throwToolExit('Failed to compile application for the Web.');
}
- } catch (err) {
+ } on Exception catch (err) {
throwToolExit(err.toString());
} finally {
status.stop();
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart
index ceeedc1..ad93955 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart
@@ -7,6 +7,7 @@
import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/assemble.dart';
+import 'package:flutter_tools/src/runner/flutter_command_runner.dart';
import 'package:mockito/mockito.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
@@ -15,6 +16,7 @@
import '../../src/testbed.dart';
void main() {
+ FlutterCommandRunner.initFlutterRoot();
Cache.disableLocking();
final Testbed testbed = Testbed(overrides: <Type, Generator>{
BuildSystem: () => MockBuildSystem(),
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
index 51f018b..75079c7 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart
@@ -76,7 +76,7 @@
'--show-test-device',
]);
fail('Expect exception');
- } catch (e) {
+ } on Exception catch (e) {
expect(e.toString(), isNot(contains('--fast-start is not supported with --use-application-binary')));
}
}, overrides: <Type, Generator>{
@@ -102,7 +102,7 @@
'--no-pub',
]);
fail('Expect exception');
- } catch (e) {
+ } on Exception catch (e) {
expect(e, isInstanceOf<ToolExit>());
}
final BufferLogger bufferLogger = globals.logger as BufferLogger;
@@ -127,7 +127,7 @@
'--no-pub',
]);
fail('Expect exception');
- } catch (e) {
+ } on Exception catch (e) {
expect(e, isInstanceOf<ToolExit>());
expect(e.toString(), contains('No pubspec.yaml file found'));
}
@@ -221,8 +221,8 @@
} on ToolExit catch (e) {
// We expect a ToolExit because no devices are attached
expect(e.message, null);
- } catch (e) {
- fail('ToolExit expected');
+ } on Exception catch (e) {
+ fail('ToolExit expected, got $e');
}
verifyInOrder(<void>[
@@ -293,8 +293,8 @@
} on ToolExit catch (e) {
// We expect a ToolExit because app does not start
expect(e.message, null);
- } catch (e) {
- fail('ToolExit expected');
+ } on Exception catch (e) {
+ fail('ToolExit expected, got $e');
}
final List<dynamic> captures = verify(mockUsage.sendCommand(
captureAny,
diff --git a/packages/flutter_tools/test/commands.shard/hermetic/version_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/version_test.dart
index 482c379..972b433 100644
--- a/packages/flutter_tools/test/commands.shard/hermetic/version_test.dart
+++ b/packages/flutter_tools/test/commands.shard/hermetic/version_test.dart
@@ -163,7 +163,7 @@
try {
await command.getTags();
fail('ToolExit expected');
- } catch(e) {
+ } on Exception catch (e) {
expect(e, isA<ToolExit>());
}
}, overrides: <Type, Generator>{
diff --git a/packages/flutter_tools/test/general.shard/android/android_device_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_test.dart
index 9097626..982550d 100644
--- a/packages/flutter_tools/test/general.shard/android/android_device_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_device_test.dart
@@ -584,7 +584,9 @@
final AndroidDevice device = AndroidDevice('emulator-5555');
expect(await device.emulatorId, isNull);
}, overrides: <Type, Generator>{
- AndroidConsoleSocketFactory: () => (String host, int port) => throw 'Fake socket error',
+ AndroidConsoleSocketFactory: () {
+ return (String host, int port) => throw Exception('Fake socket error');
+ },
ProcessManager: () => mockProcessManager,
});
diff --git a/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart b/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart
index b1cfd66..8f12b4e 100644
--- a/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart
+++ b/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart
@@ -80,6 +80,13 @@
when(globals.processManager.runSync(<String>[sdk.sdkManagerPath, '--version'],
environment: argThat(isNotNull, named: 'environment')))
.thenReturn(ProcessResult(1, 0, '26.1.1\n', ''));
+ if (globals.platform.isMacOS) {
+ when(globals.processManager.runSync(
+ <String>['/usr/libexec/java_home'],
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment'),
+ )).thenReturn(ProcessResult(0, 0, '', ''));
+ }
expect(sdk.sdkManagerVersion, '26.1.1');
}, overrides: <Type, Generator>{
FileSystem: () => fs,
@@ -112,6 +119,13 @@
when(globals.processManager.runSync(<String>[sdk.sdkManagerPath, '--version'],
environment: argThat(isNotNull, named: 'environment')))
.thenReturn(ProcessResult(1, 1, '26.1.1\n', 'Mystery error'));
+ if (globals.platform.isMacOS) {
+ when(globals.processManager.runSync(
+ <String>['/usr/libexec/java_home'],
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment'),
+ )).thenReturn(ProcessResult(0, 0, '', ''));
+ }
expect(sdk.sdkManagerVersion, isNull);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart
index e75dde6..515d129 100644
--- a/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart
+++ b/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart
@@ -70,26 +70,32 @@
Future<void> buildAndVerifyAssets(
List<String> assets,
List<String> packages,
- String expectedAssetManifest,
- ) async {
+ String expectedAssetManifest, {
+ bool expectExists = true,
+ }) async {
final AssetBundle bundle = AssetBundleFactory.instance.createBundle();
await bundle.build(manifestPath: 'pubspec.yaml');
for (final String packageName in packages) {
for (final String asset in assets) {
final String entryKey = Uri.encodeFull('packages/$packageName/$asset');
- expect(bundle.entries.containsKey(entryKey), true, reason: 'Cannot find key on bundle: $entryKey');
- expect(
- utf8.decode(await bundle.entries[entryKey].contentsAsBytes()),
- asset,
- );
+ expect(bundle.entries.containsKey(entryKey), expectExists,
+ reason: 'Cannot find key on bundle: $entryKey');
+ if (expectExists) {
+ expect(
+ utf8.decode(await bundle.entries[entryKey].contentsAsBytes()),
+ asset,
+ );
+ }
}
}
- expect(
- utf8.decode(await bundle.entries['AssetManifest.json'].contentsAsBytes()),
- expectedAssetManifest,
- );
+ if (expectExists) {
+ expect(
+ utf8.decode(await bundle.entries['AssetManifest.json'].contentsAsBytes()),
+ expectedAssetManifest,
+ );
+ }
}
void writeAssets(String path, List<String> assets) {
@@ -660,24 +666,15 @@
assets: assetOnManifest,
);
- try {
- await buildAndVerifyAssets(
- assetOnManifest,
- <String>['test_package'],
- null,
- );
-
- final Function watchdog = () async {
- assert(false, 'Code failed to detect missing directory. Test failed.');
- };
- watchdog();
- } catch (e) {
- // Test successful
- }
+ await buildAndVerifyAssets(
+ assetOnManifest,
+ <String>['test_package'],
+ null,
+ expectExists: false,
+ );
}, overrides: <Type, Generator>{
FileSystem: () => testFileSystem,
ProcessManager: () => FakeProcessManager.any(),
});
-
});
}
diff --git a/packages/flutter_tools/test/general.shard/base/async_guard_test.dart b/packages/flutter_tools/test/general.shard/base/async_guard_test.dart
index f0c46b7..681d7eb 100644
--- a/packages/flutter_tools/test/general.shard/base/async_guard_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/async_guard_test.dart
@@ -197,7 +197,7 @@
);
try {
await f;
- } catch (e) {
+ } on String {
caughtByHandler = true;
}
if (!completer.isCompleted) {
@@ -235,7 +235,7 @@
);
try {
await f;
- } catch (e) {
+ } on String {
caughtByHandler = true;
}
if (!completer.isCompleted) {
@@ -275,7 +275,7 @@
);
try {
await f;
- } catch (e) {
+ } on String {
caughtByHandler = true;
}
if (!completer.isCompleted) {
diff --git a/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart b/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart
index f57c970..cef022c 100644
--- a/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart
@@ -249,7 +249,7 @@
globals.fs.file('a.dart').createSync();
expect(
() => Fingerprint.fromBuildInputs(<String, String>{}, <String>['a.dart', 'b.dart']),
- throwsArgumentError,
+ throwsException,
);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
@@ -328,7 +328,7 @@
'properties': <String, String>{},
'files': <String, String>{},
});
- expect(() => Fingerprint.fromJson(jsonString), throwsArgumentError);
+ expect(() => Fingerprint.fromJson(jsonString), throwsException);
}, overrides: <Type, Generator>{
FlutterVersion: () => mockVersion,
});
@@ -338,7 +338,7 @@
'properties': <String, String>{},
'files': <String, String>{},
});
- expect(() => Fingerprint.fromJson(jsonString), throwsArgumentError);
+ expect(() => Fingerprint.fromJson(jsonString), throwsException);
}, overrides: <Type, Generator>{
FlutterVersion: () => mockVersion,
});
diff --git a/packages/flutter_tools/test/general.shard/base/signals_test.dart b/packages/flutter_tools/test/general.shard/base/signals_test.dart
index a3369d6..3c7f9f2 100644
--- a/packages/flutter_tools/test/general.shard/base/signals_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/signals_test.dart
@@ -61,8 +61,9 @@
});
testUsingContext('signal handler error goes on error stream', () async {
+ final Exception exn = Exception('Error');
signals.addHandler(signalUnderTest, (ProcessSignal s) {
- throw 'Error';
+ throw exn;
});
final Completer<void> completer = Completer<void>();
@@ -75,7 +76,7 @@
controller.add(mockSignal);
await completer.future;
await errSub.cancel();
- expect(errList, <Object>['Error']);
+ expect(errList, contains(exn));
}, overrides: <Type, Generator>{
Signals: () => Signals(),
});
diff --git a/packages/flutter_tools/test/general.shard/build_info_test.dart b/packages/flutter_tools/test/general.shard/build_info_test.dart
index 6bff476b..6fdd169 100644
--- a/packages/flutter_tools/test/general.shard/build_info_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_info_test.dart
@@ -91,6 +91,6 @@
expect(getIOSArchForName('arm64'), DarwinArch.arm64);
expect(getIOSArchForName('arm64e'), DarwinArch.arm64);
expect(getIOSArchForName('x86_64'), DarwinArch.x86_64);
- expect(() => getIOSArchForName('bogus'), throwsAssertionError);
+ expect(() => getIOSArchForName('bogus'), throwsException);
});
}
diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart
index 2c29c7e..7af793f 100644
--- a/packages/flutter_tools/test/general.shard/cache_test.dart
+++ b/packages/flutter_tools/test/general.shard/cache_test.dart
@@ -231,7 +231,7 @@
null,
});
fail('Mock thrown exception expected');
- } catch (e) {
+ } on Exception {
verify(artifact1.update());
// Don't continue when retrieval fails.
verifyNever(artifact2.update());
diff --git a/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart b/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
index 5619155..bd0ae54 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart
@@ -152,6 +152,26 @@
.thenAnswer((_) => Future<Process>.value(process));
when(mockProcessManager.canRun(any)).thenReturn(false);
+ when(mockProcessManager.runSync(
+ argThat(contains(contains('gen_snapshot'))),
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment'),
+ )).thenReturn(ProcessResult(0, 255, '', ''));
+
+ when(mockProcessManager.runSync(
+ <String>['/usr/bin/xcode-select', '--print-path'],
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment'),
+ )).thenReturn(ProcessResult(0, 0, '', ''));
+
+ when(mockProcessManager.run(
+ <String>['which', 'pod'],
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment'),
+ )).thenAnswer((_) {
+ return Future<ProcessResult>.value(ProcessResult(0, 0, '', ''));
+ });
+
mockAndroidSdk = MockAndroidSdk();
when(mockAndroidSdk.directory).thenReturn('irrelevant');
});
diff --git a/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart b/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
index 1fc1a70..83f54bd 100644
--- a/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/build_appbundle_test.dart
@@ -9,12 +9,11 @@
import 'package:flutter_tools/src/android/android_sdk.dart';
import 'package:flutter_tools/src/base/context.dart';
import 'package:flutter_tools/src/base/file_system.dart';
-
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build_appbundle.dart';
+import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/project.dart';
import 'package:flutter_tools/src/reporting/reporting.dart';
-import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
@@ -135,6 +134,26 @@
.thenAnswer((_) => Future<Process>.value(process));
when(mockProcessManager.canRun(any)).thenReturn(false);
+ when(mockProcessManager.runSync(
+ argThat(contains(contains('gen_snapshot'))),
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment'),
+ )).thenReturn(ProcessResult(0, 255, '', ''));
+
+ when(mockProcessManager.runSync(
+ <String>['/usr/bin/xcode-select', '--print-path'],
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment'),
+ )).thenReturn(ProcessResult(0, 0, '', ''));
+
+ when(mockProcessManager.run(
+ <String>['which', 'pod'],
+ workingDirectory: anyNamed('workingDirectory'),
+ environment: anyNamed('environment'),
+ )).thenAnswer((_) {
+ return Future<ProcessResult>.value(ProcessResult(0, 0, '', ''));
+ });
+
mockAndroidSdk = MockAndroidSdk();
when(mockAndroidSdk.validateSdkWellFormed()).thenReturn(const <String>[]);
when(mockAndroidSdk.directory).thenReturn('irrelevant');
diff --git a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart
index cd51b15..093008b 100644
--- a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart
+++ b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart
@@ -327,8 +327,7 @@
try {
await pub.get(context: PubContext.flutterTests, checkLastModified: true);
expect(true, isFalse, reason: 'pub.get did not throw');
- } catch (error) {
- expect(error, isA<Exception>());
+ } on ToolExit catch (error) {
expect(error.message, '/: unexpected concurrent modification of pubspec.yaml while running pub.');
}
expect(testLogger.statusText, 'Running "flutter pub get" in /...\n');
diff --git a/packages/flutter_tools/test/general.shard/devfs_test.dart b/packages/flutter_tools/test/general.shard/devfs_test.dart
index ce6e0e5..e09934e 100644
--- a/packages/flutter_tools/test/general.shard/devfs_test.dart
+++ b/packages/flutter_tools/test/general.shard/devfs_test.dart
@@ -136,7 +136,7 @@
const int kFailedAttempts = 5;
when(httpRequest.close()).thenAnswer((Invocation invocation) {
if (nRequest++ < kFailedAttempts) {
- throw 'Connection resert by peer';
+ throw Exception('Connection resert by peer');
}
return Future<HttpClientResponse>.value(httpClientResponse);
});
diff --git a/packages/flutter_tools/test/general.shard/flutter_platform_test.dart b/packages/flutter_tools/test/general.shard/flutter_platform_test.dart
index 13ef1af..6a0a98b 100644
--- a/packages/flutter_tools/test/general.shard/flutter_platform_test.dart
+++ b/packages/flutter_tools/test/general.shard/flutter_platform_test.dart
@@ -46,8 +46,17 @@
Future<Map<String, String>> captureEnvironment() async {
flutterPlatform.loadChannel('test1.dart', MockSuitePlatform());
+ when(mockProcessManager.start(
+ any,
+ environment: anyNamed('environment')),
+ ).thenAnswer((_) {
+ return Future<Process>.value(MockProcess());
+ });
await untilCalled(mockProcessManager.start(any, environment: anyNamed('environment')));
- final VerificationResult toVerify = verify(mockProcessManager.start(any, environment: captureAnyNamed('environment')));
+ final VerificationResult toVerify = verify(mockProcessManager.start(
+ any,
+ environment: captureAnyNamed('environment'),
+ ));
expect(toVerify.captured, hasLength(1));
expect(toVerify.captured.first, isA<Map<String, String>>());
return toVerify.captured.first as Map<String, String>;
@@ -146,6 +155,8 @@
class MockProcessManager extends Mock implements ProcessManager {}
+class MockProcess extends Mock implements Process {}
+
class MockPlatform extends Mock implements Platform {}
class MockHttpServer extends Mock implements HttpServer {}
diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart
index 66b6922..1f48f0b 100644
--- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart
+++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart
@@ -476,7 +476,7 @@
try {
await device.takeScreenshot(globals.fs.file('file.ppm'));
- } catch (_) {
+ } on Exception {
assert(false);
}
expect(
@@ -534,8 +534,8 @@
try {
await device.takeScreenshot(globals.fs.file('file.ppm'));
- } catch (_) {
- assert(false);
+ } on Exception catch (e) {
+ fail('Unexpected exception: $e');
}
}, overrides: <Type, Generator>{
ProcessManager: () => mockProcessManager,
diff --git a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart
index 7fc9fd0..f00d5aa 100644
--- a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart
@@ -229,9 +229,9 @@
Map<String, String> signingConfigs;
try {
signingConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app);
- } catch (e) {
+ } on Exception catch (e) {
// This should not throw
- expect(true, false);
+ fail('Code signing threw: $e');
}
expect(testLogger.statusText, contains('Apple Development: Profile 1 (1111AAAA11)'));
diff --git a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
index 441058c..1bfb6e0 100644
--- a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
@@ -54,7 +54,7 @@
expect(portForwarder.forwardedPorts.length, 2);
try {
await portForwarder.dispose();
- } catch (e) {
+ } on Exception catch (e) {
fail('Encountered exception: $e');
}
expect(portForwarder.forwardedPorts.length, 0);
diff --git a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart
index d712f7f..979ce04 100644
--- a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart
+++ b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart
@@ -387,7 +387,7 @@
engineDir: 'engine/path',
);
fail('ToolExit expected');
- } catch(e) {
+ } on Exception catch (e) {
expect(e, isA<ToolExit>());
verifyNever(mockProcessManager.run(
argThat(containsAllInOrder(<String>['pod', 'install'])),
@@ -436,7 +436,7 @@
engineDir: 'engine/path',
);
fail('ToolExit expected');
- } catch (e) {
+ } on Exception catch (e) {
expect(e, isA<ToolExit>());
expect(
testLogger.errorText,
diff --git a/packages/flutter_tools/test/integration.shard/test_driver.dart b/packages/flutter_tools/test/integration.shard/test_driver.dart
index d361d16..586d9eb 100644
--- a/packages/flutter_tools/test/integration.shard/test_driver.dart
+++ b/packages/flutter_tools/test/integration.shard/test_driver.dart
@@ -528,7 +528,7 @@
// have already completed.
_currentRunningAppId = (await started)['params']['appId'] as String;
prematureExitGuard.complete();
- } catch (error, stackTrace) {
+ } on Exception catch (error, stackTrace) {
prematureExitGuard.completeError(error, stackTrace);
}
}());
@@ -732,7 +732,7 @@
Map<String, dynamic> _parseJsonResponse(String line) {
try {
return castStringKeyedMap(json.decode(line));
- } catch (e) {
+ } on Exception {
// Not valid JSON, so likely some other output.
return null;
}
@@ -771,7 +771,7 @@
try {
final Map<String, dynamic> response = castStringKeyedMap(json.decode(line)[0]);
return response;
- } catch (e) {
+ } on Exception {
// Not valid JSON, so likely some other output that was surrounded by [brackets]
return null;
}
diff --git a/packages/flutter_tools/test/src/common.dart b/packages/flutter_tools/test/src/common.dart
index fb446bc..763c9db 100644
--- a/packages/flutter_tools/test/src/common.dart
+++ b/packages/flutter_tools/test/src/common.dart
@@ -139,7 +139,8 @@
fail('ToolExit expected, but nothing thrown');
} on ToolExit catch(e) {
expect(e.message, messageMatcher);
- } catch(e, trace) {
+ // Catch all exceptions to give a better test failure message.
+ } catch (e, trace) { // ignore: avoid_catches_without_on_clauses
fail('ToolExit expected, got $e\n$trace');
}
}
diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart
index cc21105..868f5a6 100644
--- a/packages/flutter_tools/test/src/context.dart
+++ b/packages/flutter_tools/test/src/context.dart
@@ -151,7 +151,8 @@
return await testMethod();
},
);
- } catch (error) {
+ // This catch rethrows, so doesn't need to catch only Exception.
+ } catch (error) { // ignore: avoid_catches_without_on_clauses
_printBufferedErrors(context);
rethrow;
}
diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart
index dc6bab5..08c3c77 100644
--- a/packages/flutter_tools/test/src/mocks.dart
+++ b/packages/flutter_tools/test/src/mocks.dart
@@ -398,7 +398,8 @@
(List<int> data) {
try {
add(data);
- } catch (err, stack) {
+ // Catches all exceptions to propagate them to the completer.
+ } catch (err, stack) { // ignore: avoid_catches_without_on_clauses
sub.cancel();
completer.completeError(err, stack);
}
diff --git a/packages/flutter_tools/tool/tool_coverage.dart b/packages/flutter_tools/tool/tool_coverage.dart
index 9f1816d..3fb65d0 100644
--- a/packages/flutter_tools/tool/tool_coverage.dart
+++ b/packages/flutter_tools/tool/tool_coverage.dart
@@ -73,7 +73,8 @@
Isolate isolate;
try {
isolate = await _spawnIsolate(codePath, receivePort.sendPort);
- } catch (error) {
+ // This catch rethrows, so doesn't need to catch only Exception.
+ } catch (error) { // ignore: avoid_catches_without_on_clauses
receivePort.close();
rethrow;
}