Skip to content

Commit 4e783f2

Browse files
authored
Catch and redirect exception in SaneIsolate to main isolate (#20)
* Catch and redirect exception in SaneIsolate to main isolate Fixes #17 * Redirect stack trace
1 parent 98643a9 commit 4e783f2

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'package:sane/src/exceptions.dart';
2+
import 'package:sane/src/isolate_messages/interface.dart';
3+
4+
class ExceptionResponse implements IsolateResponse {
5+
ExceptionResponse({
6+
required this.exception,
7+
required this.stackTrace,
8+
});
9+
10+
final SaneException exception;
11+
final StackTrace stackTrace;
12+
}

packages/sane/lib/src/sane_isolate.dart

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:sane/src/isolate_messages/cancel.dart';
66
import 'package:sane/src/isolate_messages/close.dart';
77
import 'package:sane/src/isolate_messages/control_button_option.dart';
88
import 'package:sane/src/isolate_messages/control_option.dart';
9+
import 'package:sane/src/isolate_messages/exception.dart';
910
import 'package:sane/src/isolate_messages/exit.dart';
1011
import 'package:sane/src/isolate_messages/get_all_option_descriptors.dart';
1112
import 'package:sane/src/isolate_messages/get_devices.dart';
@@ -57,6 +58,13 @@ class SaneIsolate implements Sane {
5758
final response = await replyPort.first;
5859
replyPort.close();
5960

61+
if (response is ExceptionResponse) {
62+
Error.throwWithStackTrace(
63+
response.exception,
64+
response.stackTrace,
65+
);
66+
}
67+
6068
return response;
6169
}
6270

@@ -300,9 +308,17 @@ void _isolateEntryPoint(_IsolateEntryPointArgs args) {
300308
isolateReceivePort.listen((envellope) async {
301309
envellope = envellope as _IsolateMessageEnveloppe;
302310

303-
envellope.replyPort.send(
304-
await envellope.message.handle(sane),
305-
);
311+
late IsolateResponse response;
312+
try {
313+
response = await envellope.message.handle(sane);
314+
} on SaneException catch (exception, stackTrace) {
315+
response = ExceptionResponse(
316+
exception: exception,
317+
stackTrace: stackTrace,
318+
);
319+
}
320+
321+
envellope.replyPort.send(response);
306322
});
307323
}
308324

0 commit comments

Comments
 (0)