如果库吞没所有异常,我如何调试我的异步,基于承诺的代码?

hug*_*omg 15 javascript debugging dojo promise deferred

问题

JSFiddle:http: //jsfiddle.net/missingno/Gz8Pe/2/

我有一些看起来像这样的代码:

var d = new Deferred();
d.resolve(17);
return d.then(function(){
     //do some stuff...
})
.then(function(){
    var obj = a_funtion_that_returns_null_on_IE();
    var x = obj.some_property; //BOOM!
});
Run Code Online (Sandbox Code Playgroud)

问题是,当我在IE上时,我只能看到'obj' is null or not an object错误,没有任何对相应行号的引用,也没有调试器停在违规行(就像我希望的那样).

这种问题使得代码很难调试,我现在能想到的唯一解决方案(搞乱控制流库或使用调试器或console.log进行逐步调试)是我的事情.宁可不必做.

我的想法是怎么回事

为了允许在链被触发后添加errbacks,then将抢先捕获回调抛出的任何异常.我认为这是IE调试器没有停止错误或显示通常的错误消息的原因,其中包含行号.

没有行号的错误消息来自控制流库:它提供了一个deferredOnError挂钩,只要捕获并保存以供日后使用,就会调用该挂钩,默认行为是console.error-the Error对象:

dojo.config.deferredOnError = function(err){
    //a chance to log the exception after it is captured by "then"
    //or do other things with it
    console.error(err);
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,我无法找到从IE中的错误对象获取行号或堆栈跟踪的方法,并且以一种不允许我重新抛出异常并让它冒泡到顶层的方式调用钩子.

我想要的是

我希望有一种更好的方法来调试异步代码,然后逐步调试调试器.在最好的情况下,有一种方法可以让调试器暂停异常(就像在未处理的异常上一样),或者至少是抛出的Error对象获取行号或堆栈跟踪的方法.

fre*_*nte 12

这适用于没有事先配置的任何框架,所有最近的浏览器都支持此功能

暂停捕获的异常:这实际上会阻止javascript的执行,并且会在问题代码发生的时候带您到达确切的位置.

暂停捕获的异常

在Chrome中:

  1. 开发者工具,
  2. 来源标签,
  3. 暂停异常(类似停止的图标)然后
  4. 暂停对捕获的异常复选框