From 8d6dc620d63e70fe8599b3ff0c17a88b233c4d0c Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Thu, 15 Aug 2019 12:13:12 -0700 Subject: [PATCH] fix rpc exception for real (#38575) --- packages/flutter_tools/lib/src/resident_runner.dart | 5 ++++- packages/flutter_tools/lib/src/run_hot.dart | 9 +++++++-- packages/flutter_tools/lib/src/vmservice.dart | 3 +-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 14091bf9ef3..ac96adbfaf8 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -1116,7 +1116,10 @@ class TerminalHandler { 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 4a7ea38877a..a21ba74b414 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/error_code.dart' as rpc_error_code; 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 @@ class HotRunner extends ResidentRunner { 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 05d37e8210f..a3de239a70b 100644 --- a/packages/flutter_tools/lib/src/vmservice.dart +++ b/packages/flutter_tools/lib/src/vmservice.dart @@ -13,7 +13,6 @@ import 'package:stream_channel/stream_channel.dart'; 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 @@ class VMService { Future _streamListen(String streamId) async { if (!_listeningFor.contains(streamId)) { _listeningFor.add(streamId); - await asyncGuard(() => _sendRequest('streamListen', {'streamId': streamId})); + await _sendRequest('streamListen', {'streamId': streamId}); } }