作为 AMP Socket 连接调用的一部分,我MultiReasonException
在 DNS 查找过程中遇到了问题。抛出的实际异常是一个 NX 域,这很好 - 查找是针对当前关闭的主机。问题是我无法捕获和处理异常 - 它最终在我能够捕获它的循环级别结束,但此时它没有用。
我试图在一个简单的测试脚本中重现以在此处发布,但如果我这样做,它可以正常工作:
Loop::run(function(){
$res = yield \Amp\Dns\resolve("tp-link-hs110-5");
var_dump($res);
});
并将其包装在 try catch 中,我能够捕获 DNS 异常——它甚至不会抛出MultiReasonException
. 我认为这与我的实际应用程序有很多“并发”的事实有关,这意味着循环实际上会在等待 DNS 请求失败时停止并执行其他操作(“推迟”dns 查找协程) . 由于某种原因,这似乎导致异常被包裹在 aMultiReasonException
中(xdebug 中的 Mutli 中仅列出了 1 个异常)。更重要的MultiReasonException
是,它并没有被扔到我进行连接调用的协程中,它只是最终被扔到了Loop::run
调用中——这是真正的问题。我无法在这里处理异常,因为它不在调用上下文中,并且可能来自代码中的任何地方。
任何人都可以帮助阐明这一点,或者甚至为我指出正确的方向以进一步确定这一点吗?我完全没主意了。试图通过大量的协程和占位符函数来追踪这个东西是一场噩梦。您到底是如何通过 AMP 堆栈调试这些东西的?