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