javascript - 如果库吞噬了所有异常,我该如何调试基于 promise 的异步代码?

标签 javascript debugging dojo deferred promise

问题

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 的执行,并会在问题代码发生时将您准确地带到哪里。

Pause On Caught Exceptions

在 Chrome 中:

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

关于javascript - 如果库吞噬了所有异常,我该如何调试基于 promise 的异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9183159/

相关文章:

javascript - 在生产中自动关闭调试变量

python - Django Defect-dojo:aws-prowler上传失败

javascript - 移动浏览器中的网络 worker

javascript - react 显示子组件值的总和不准确

node.js - 哪个 IDE 支持 Node.js 应用程序的 CoffeeScript 调试(源映射、断点和调用堆栈)?

c++ - 如何跳过调试 Visual C++ 2013 中的所有 std 命名空间?

javascript - 从节点列表中的节点获取 id 属性

javascript - 通过 AngularJS 和 json 对象对测验进行评分

dojo - 禁用提交按钮直到验证

javascript - 如何从 dojox/widget/ColorPicker onChange 中获取颜色?