Определить, есть ли у 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, но пока это не больше чем идеи.

Редактировать: Также возникает вопрос, должно ли это даже генерировать, буферизовать или просто отбрасывать полученное значение.

Другие вопросы по тегам