问题
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
钩子(Hook),每当异常被捕获并保存以备后用时调用,默认行为是控制台。对 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);
}
可悲的是,我想不出一种方法来从 IE 中的错误对象获取行号或堆栈跟踪,并且 Hook 的调用方式不允许我重新抛出异常并让它冒泡到顶层。
我想要什么
我想有一个更好的方法来调试异步代码,然后逐步使用调试器。在最好的情况下一种让调试器停止异常的方法(就像它在处理未处理的异常时所做的那样)或至少一种获取行号或堆栈的方法来自抛出的错误对象的痕迹。
最佳答案
这适用于任何框架,无需事先配置,所有最新的浏览器都支持这一点。
Pause On Caught Exceptions:这实际上会停止 javascript 的执行,并会在问题代码发生时将您准确地带到哪里。
在 Chrome 中:
- 开发者工具,
- 来源标签,
- 出现异常时暂停(类似停止的图标)然后
- 捕获到异常时暂停复选框
关于javascript - 如果库吞噬了所有异常,我该如何调试基于 promise 的异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9183159/