Reland: [flutter_tool] Where possible, catch only subtypes of Exception (#51567)
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 681d503..b0f5072 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 0f52351..f5c0544 100644 --- a/packages/flutter_tools/lib/src/base/logger.dart +++ b/packages/flutter_tools/lib/src/base/logger.dart
@@ -364,7 +364,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 0ef5786..53370f6 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 484ea58..71a3973 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 5babf68..2595b29 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -189,7 +189,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); } @@ -271,10 +271,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) { @@ -428,7 +428,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)); } } @@ -658,7 +658,7 @@ const int kExpectedExitCode = 255; try { return processUtils.runSync(<String>[genSnapshotPath]).exitCode == kExpectedExitCode; - } catch (error) { + } on Exception { return false; } } @@ -786,7 +786,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 108436a..9e77b81 100644 --- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart +++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -344,7 +344,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 d24e3c7..66d6622 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -873,7 +873,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; @@ -887,7 +887,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; @@ -899,7 +899,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'); } @@ -1301,7 +1301,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 32f98a6..4c53ad6 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 30885f9..129679e 100644 --- a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart +++ b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
@@ -735,7 +735,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; } @@ -989,7 +990,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 9a9535e..488ffa2 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 fab0c2b..e0f8fb0 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 1dec6a0..f0c3e99 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 ebfd87b..8d1b459e 100644 --- a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart
@@ -355,7 +355,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'])), @@ -404,7 +404,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; }