【问题标题】:Detect if ReceivePort has handler prior to call在调用之前检测 ReceivePort 是否有处理程序
【发布时间】:2013-04-13 20:37:35
【问题描述】:

我使用 spawnFunction 创建了一个隔离,并提供了一个错误处理程序并将发送包装在 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');
    }
  });
}

【问题讨论】:

    标签: dart dart-isolates


    【解决方案1】:

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

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

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

    我们正在考虑异步 try/catch,但目前还只是想法。

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

    【讨论】:

    • 我会非常满意: - 单向端口和双向端口之间的区别,因此我可以在回复之前检查客户端(或者如果我认为回话很重要,则拒绝请求...) - 一个构造函数,允许对 receivePort 进行可选回复,默认为 noop
    • 哦...或者 noop 可以在被覆盖之前抛出“在 ReceivePort 中未处理的回复”之类的?这样它就可以捕获(我认为)并且更清楚正在发生的事情......
    • 最后,是否存在一个现有的错误,我可以观察/将这些想法放入其中以获得更好的持久性?
    • 客户端无法知道服务器是否有处理程序。隔离彼此异步工作。我认为您的特定问题还没有错误。请提交一份。
    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 2012-04-17
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2015-07-23
    相关资源
    最近更新 更多