fix rpc exception for real (#38575)
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 14091bf..ac96adb 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -1116,7 +1116,10 @@ lastReceivedCommand = command; await _commonTerminalInputHandler(command); } catch (error, st) { - printError('$error\n$st'); + // Don't print stack traces for known error types. + if (error is! ToolExit) { + printError('$error\n$st'); + } await _cleanUp(null); rethrow; } finally {
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 4a7ea38..a21ba74 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -8,6 +8,7 @@ import 'package:json_rpc_2/json_rpc_2.dart' as rpc; import 'package:meta/meta.dart'; +import 'base/async_guard.dart'; import 'base/common.dart'; import 'base/context.dart'; import 'base/file_system.dart'; @@ -576,10 +577,14 @@ if (!(await hotRunnerConfig.setupHotRestart())) { return OperationResult(1, 'setupHotRestart failed'); } - result = await _restartFromSources( + // The current implementation of the vmservice and JSON rpc may throw + // unhandled exceptions into the zone that cannot be caught with a regular + // try catch. The usage is [asyncGuard] is required to normalize the error + // handling, at least until we can refactor the underlying code. + result = await asyncGuard(() => _restartFromSources( reason: reason, benchmarkMode: benchmarkMode, - ); + )); if (!result.isOk) { restartEvent = 'restart-failed'; }
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart index 05d37e8..a3de239 100644 --- a/packages/flutter_tools/lib/src/vmservice.dart +++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -13,7 +13,6 @@ import 'package:web_socket_channel/io.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; -import 'base/async_guard.dart'; import 'base/common.dart'; import 'base/context.dart'; import 'base/file_system.dart'; @@ -359,7 +358,7 @@ Future<void> _streamListen(String streamId) async { if (!_listeningFor.contains(streamId)) { _listeningFor.add(streamId); - await asyncGuard(() => _sendRequest('streamListen', <String, dynamic>{'streamId': streamId})); + await _sendRequest('streamListen', <String, dynamic>{'streamId': streamId}); } }