Issue
I’ve got an isolate created using spawnFunction with an error handler provided and wrapping the send in a try/catch.
If I try to send to the replyTo and it doesn’t have a receive registered then it (rightfully) throws a method not found exception but I can’t figure out how to trap and handle it.
If you uncomment the recPort line it should all work fine.
echoIsolate() {
port.receive((message, replyTo) {
replyTo.send(message, port.toSendPort());
});
}
bool errorHandler(IsolateUnhandledException ex) {
print('Got error');
return true;
}
run_tests() {
test('bad rec', () {
try {
var recPort = new ReceivePort();
//recPort.receive((message, replyTo) => print('Got echo: ${message}'));
var isolatePort = spawnFunction(echoIsolate, errorHandler);
isolatePort.send('message', recPort.toSendPort());
} catch(ex) {
print('Got exception');
}
});
}
Solution
Currently (as of April 2013) there is no way to handle this error. (afaik)
Two improvements would solve the problem: 1) a way to set a global exception handler, or 2) an asynchronous try/catch.
Global exception handlers are already possible if the code runs in an isolate. One can pass an exception-handler as argument to spawnFunction
. We are going to improve the API of isolates but currently that’s the only way to catch uncaught exceptions.
We are thinking about asynchronous try/catch, but so far it’s not more than ideas.
Edit: Also there is the question if this should even throw, buffer, or just discard the received value.
Answered By – Florian Loitsch
Answer Checked By – Cary Denson (FlutterFixes Admin)