繁体   English   中英

AMPHP 抛出一个无法捕获的 MultiReasonException - 这是一个错误吗?

[英]AMPHP throws an uncatchable MultiReasonException - Is this a bug?

作为 AMP Socket 连接调用的一部分,我在 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 堆栈调试这些东西的?

如果其他人有类似的问题,我想我找到了自己问题的答案。

这是 Amp 堆栈如何处理异常的微妙之处。 我打电话放大器功能some在高级别功能1分或更多的承诺。 这作用于一个承诺链,最终导致一个进行 DNS 查找的函数。 当 DNS 查找失败并抛出与 DNS 相关的异常(我没有在 Promise 中捕获)时,它会将承诺链向上渗透到一些,它似乎总是抛出MultiReasonException即使它只有 1 个它正在执行的承诺。 这意味着我总是得到一个包含 DNS 异常的MultiReasonException 这会很好,除非我查看与 DNS 相关的异常的堆栈跟踪,它当然不包含我的任何函数 - 所以我看不到它是如何被捕获的(我也没有试图捕获它在源头,事实证明它会起作用,但从跟踪中看起来好像它不会)。

这是因为在 amp 处于后续滴答时抛出异常,因此我的代码当前不在堆栈中。 一旦异常被 AMP 堆栈中的代码抛出,异常中的跟踪当然会被锁定。然后它会被扔回我的原始承诺(生成器),它请求查找,在那里它可以被捕获,但是由于我没有抓住它,它一直被抛出到some调用,在那里它显示为MultiReasonException我感到困惑。

我不确定这有多连贯,但也许它会帮助某人。 这个故事的寓意 - 不要试图变得聪明 - 只要抓住相关的异常,你就会产生会抛出它的承诺。 AMP 中的异常堆栈跟踪可能会产生误导。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM