2013-04-13 37 views
1

我已经使用spawnFunction创建了一个使用提供的错误处理程序创建的隔离区,并在try/catch中封装了send。检测ReceivePort是否在调用之前有处理程序

如果我尝试发送给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'); 
    } 
    }); 
} 

回答

2

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

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

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

我们正在考虑异步try/catch,但到目前为止,它不过是想法。

编辑:还有一个问题,如果这甚至应该抛出,缓冲或丢弃收到的值。

+0

我会完全满意: - 单向和双向端口之间的区别,所以我可以在回复之前检查客户端(或者如果我认为重要的是要回复,请拒绝请求...) - 一个构造函数,它允许可选地回复receivePort并且默认为noop – Perry

+0

哦......或者noop可以,直到被覆盖,抛出'未处理的回复在ReceivePort'或者其他类似的东西?这样它就可以被捕获(我认为)并且更清楚发生了什么...... – Perry

+0

最后,是否存在一个现有的缺陷,我可以观察/将这些想法变为更好的永久性? – Perry

相关问题