问题
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!
});
问题是,当我在 IE 上时,我只能看到'obj' is null or not an object
错误,没有任何对相应行号的引用,也没有调试器在有问题的行处停止(就像我希望的那样)。
这类问题使代码难以调试,而我现在能想到的唯一解决方案(弄乱控制流库或使用调试器或 console.log 进行逐步调试)是我宁可不用做。
我认为正在发生的事情
为了允许在触发链后添加 errbacks,then
将抢先捕获回调抛出的任何异常。我认为这是 IE 调试器没有停止错误或显示带有行号的通常错误消息的原因。
没有行号的错误消息来自控制流库:它提供了一个deferredOnError
挂钩,每当捕获到异常并保存以供以后使用时都会调用该挂钩,默认行为是 console.error-ing 错误对象:
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);
}
可悲的是,我无法找到从 IE 中的错误对象获取行号或堆栈跟踪的方法,并且该挂钩的调用方式不允许我重新抛出异常并让它冒泡到顶层。
我想要的是
我希望有一种更好的方法来调试异步代码,然后一步一步地与调试器一起进行。在最好的情况下,一种让调试器在异常上停止的方法(就像它在未处理的异常上所做的那样),或者至少是一种从抛出的 Error 对象中获取行号或堆栈跟踪的方法。