Определить, есть ли у ReceivePort обработчик до вызова
У меня есть изолят, созданный с помощью spawnFunction с предоставленным обработчиком ошибок и упаковкой отправки в try/catch.
Если я пытаюсь отправить в replyTo, и для него не зарегистрировано получение, то оно (по праву) выдает исключение метода not found, но я не могу понять, как его перехватить и обработать.
Если вы раскомментируете строку recPort, все должно работать нормально.
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');
}
});
}
1 ответ
В настоящее время (по состоянию на апрель 2013 года) нет способа устранить эту ошибку. (насколько мне известно)
Два улучшения решат проблему: 1) способ установки глобального обработчика исключений или 2) асинхронный try/catch.
Глобальные обработчики исключений уже возможны, если код выполняется изолированно. В качестве аргумента можно передать обработчик исключений spawnFunction
, Мы собираемся улучшить API изолятов, но в настоящее время это единственный способ отловить неисследованные исключения.
Мы думаем об асинхронном try / catch, но пока это не больше чем идеи.
Редактировать: Также возникает вопрос, должно ли это даже генерировать, буферизовать или просто отбрасывать полученное значение.