在使用Chrome进行调试时,调试器有一些细节可以导航未处理异常的调用堆栈。我已经开始使用Q promises,现在未处理的异常基本上转换为被拒绝的承诺。这很好,除了调试。考虑一下这个例子:
promise.done(do_work)
do_work函数中抛出的任何异常都将被Q捕获,然后在下一个tick中被抛出为未处理的异常。这个问题是Chrome调试器中的callstack很无聊,只代表Q flush。确实,异常的堆栈属性是正确的,但这只是Chrome调试器中的工具提示,并且使用起来很烦人。
我尝试过这样的事情:
promise.done(do_work, function(e){throw e;})
但是这些例外再次被Q抓住了;并且,无论如何,它并不重要,因为当你到达错误处理程序时,堆栈已经从下一个滴答。我也尝试过玩Q.onerror和其他人,但是他们也有同样的问题。
有没有办法让Q在开发过程中真正忽略某些调用的异常,这样Chrome调试器可以在Q进入下一个进程滴答之前获得一个很好的原始调用堆栈?
答案 0 :(得分:1)
看起来我找到了一个可行的答案。我在这里张贴所以它可能有希望帮助别人,否则有人可以指出一个更清洁的方法,因为我认为这是一个黑客...
以下方法可以在do_work函数中捕获未处理的异常,以便在Chrome调试器中捕获。您不仅可以获得良好的调用堆栈导航,还可以在失败时检查值和状态。
而不是:
promise.done(do_work)
使用:
promise.done -> setTimeout do_work, 0
或者在JavaScript中:
promise.done(function(){setTimeout(do_work,0);});
有了这个hack,对do_work()的调用依赖于promise fullfillment,但是然后脱离Q机制来捕获异常,因此可以更容易地使用Chrome调试错误。我也可以使用这种模式来帮助调试承诺链中间的函数:
而不是:
new_promise = promise.then(do_intermediate_work)
使用:
new_promise = promise.then -> Q.promise (resolve)-> setTimeout(
->
do_intermediate_work()
resolve()
0
)
或者在JavaScript中:
new_promise = promise.then(function() {
return Q.promise(function(resolve) {
setTimeout((function() {
do_intermediate_work();
resolve();
}), 0);
});
});
我希望我在这里找不到更好的解决方案,因为这似乎是当前工具链的可用性问题,并且使用promises进行调试..
答案 1 :(得分:0)
在这种意义上没有有用的原始调用堆栈,因为调用堆栈不能通过异步边界工作。我不确定启用长堆栈跟踪时获得的“假”扩展堆栈的问题是什么(除了它只是1级而不是所有方式的事实) - 这些与正常的堆栈跟踪一样可读。 ...