检测ReceivePort在调用之前是否具有处理程序

时间:2013-04-13 20:37:36

标签: dart dart-isolates

我有一个使用spawnFunction创建的隔离,并提供了一个错误处理程序,并将try包装在try / catch中。

如果我尝试发送到replyTo并且它没有注册接收,那么它(正当地)会抛出一个找不到异常的方法,但我无法弄清楚如何捕获和处理它。

如果取消注释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 个答案:

答案 0 :(得分:2)

目前(截至2013年4月)无法处理此错误。 (AFAIK)

两个改进可以解决问题:1)设置全局异常处理程序的方法,或2)异步try / catch。

如果代码在隔离区中运行,则已经可以使用全局异常处理程序。可以将异常处理程序作为参数传递给spawnFunction。我们将改进隔离区的API,但目前这是捕获未捕获异常的唯一方法。

我们正在考虑异步尝试/捕获,但到目前为止它只不过是想法。

编辑:还有一个问题是,这是否应该抛出,缓冲或只是丢弃收到的值。