Q Promises - 将拒绝转换为未处理的异常

时间:2013-12-23 19:40:12

标签: debugging google-chrome exception promise q

在使用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进入下一个进程滴答之前获得一个很好的原始调用堆栈?

2 个答案:

答案 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级而不是所有方式的事实) - 这些与正常的堆栈跟踪一样可读。 ...