Skip to content

Commit c33f920

Browse files
committed
Gracefully handle isolate exceptions
1 parent 8185fd9 commit c33f920

File tree

4 files changed

+61
-9
lines changed

4 files changed

+61
-9
lines changed

webdev/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
- Checks for a dependency on `build_web_compilers`.
44

5+
- Gracefully handle exceptions.
6+
57
## 0.1.0
68

79
- Initial release. Supports basic invocation of `build` and `serve` with

webdev/bin/webdev.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'dart:async';
66
import 'dart:io';
7+
import 'dart:isolate';
78

89
import 'package:args/command_runner.dart';
910
import 'package:io/ansi.dart';
@@ -35,5 +36,9 @@ Future main(List<String> args) async {
3536
print(' ${e.path}');
3637
}
3738
exitCode = ExitCode.config.code;
39+
} on IsolateSpawnException catch (e) {
40+
print(red.wrap('An unexpected exception has occurred.'));
41+
print(e.message);
42+
exitCode = ExitCode.software.code;
3843
}
3944
}

webdev/lib/src/command/build_runner_command_base.dart

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,18 @@ abstract class BuildRunnerCommandBase extends Command<int> {
5353
stderr.writeln(new Trace.parse(trace).terse);
5454
if (exitCode == 0) exitCode = 1;
5555
});
56-
await Isolate.spawnUri(buildRunnerScript, arguments, messagePort.sendPort,
57-
onExit: exitPort.sendPort,
58-
onError: errorPort.sendPort,
59-
automaticPackageResolution: true);
56+
57+
try {
58+
await Isolate.spawnUri(buildRunnerScript, arguments, messagePort.sendPort,
59+
onExit: exitPort.sendPort,
60+
onError: errorPort.sendPort,
61+
automaticPackageResolution: true);
62+
} on IsolateSpawnException {
63+
exitPort.close();
64+
errorPort.close();
65+
messagePort.close();
66+
rethrow;
67+
}
6068
StreamSubscription exitCodeListener;
6169
exitCodeListener = messagePort.listen((isolateExitCode) {
6270
if (isolateExitCode is! int) {
@@ -90,11 +98,18 @@ Future<Uri> _buildRunnerScript() async {
9098
var exitPort = new ReceivePort();
9199
var errorPort = new ReceivePort();
92100

93-
await Isolate.spawnUri(dataUri, [], messagePort.sendPort,
94-
onExit: exitPort.sendPort,
95-
onError: errorPort.sendPort,
96-
errorsAreFatal: true,
97-
packageConfig: new Uri.file(_packagesFileName));
101+
try {
102+
await Isolate.spawnUri(dataUri, [], messagePort.sendPort,
103+
onExit: exitPort.sendPort,
104+
onError: errorPort.sendPort,
105+
errorsAreFatal: true,
106+
packageConfig: new Uri.file(_packagesFileName));
107+
} on IsolateSpawnException {
108+
messagePort.close();
109+
exitPort.close();
110+
errorPort.close();
111+
rethrow;
112+
}
98113

99114
var allErrorsFuture = errorPort.forEach((error) {
100115
var errorList = error as List;

webdev/test/integration_test.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,34 @@ packages:
127127
contains('A `.packages` file does not exist in the target directory.'));
128128
await process.shouldExit(78);
129129
});
130+
131+
test('should fail gracefully if there is an isolate error', () async {
132+
await d.file('pubspec.lock', '''
133+
# Copy-pasted from a valid run
134+
packages:
135+
build_runner:
136+
dependency: "direct main"
137+
description:
138+
name: build_runner
139+
url: "https://pub.dartlang.org"
140+
source: hosted
141+
version: "0.8.0"
142+
build_web_compilers:
143+
dependency: "direct main"
144+
description:
145+
name: build_web_compilers
146+
url: "https://pub.dartlang.org"
147+
source: hosted
148+
version: "0.3.4+2"
149+
''').create();
150+
151+
await d.file('.packages', '').create();
152+
153+
var process = await TestProcess.start('dart', [_webdevBin, 'build'],
154+
workingDirectory: d.sandbox);
155+
var output = (await process.stdoutStream().join('\n')).trim();
156+
157+
expect(output, contains('An unexpected exception has occurred.'));
158+
await process.shouldExit(70);
159+
});
130160
}

0 commit comments

Comments
 (0)