抛出新错误(字符串)未在F12中显示

时间:2016-10-30 16:45:50

标签: javascript jquery error-handling

我有一个抛出Error

的JS脚本
$.when(verifyInitArgs(initArgs))
    .then(function argsAreValid() {
        initialiseForm();
    }, function argsInvalid(error) {
        throw new Error(error);
    });

error变量是string。设置断点时,我可以使用typeof看到这一点:

>> typeof error
"string"

但是,在IE或Firefox的控制台窗口中没有显示抛出的错误。

如果我直接在浏览器控制台中输入throw new Error("something");,那么它会按预期工作,它会在控制台中显示为错误。

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

回想一下,then(以及catch等)会创建承诺,即回调中的代码会影响其结果。在Promises / A +的承诺风格中(JavaScript的本机承诺遵循那些语义,并且jQuery一直试图将Deferreds排成一行 - 而你现在使用的v3.1.1现在已经在线了,我相信),当你投入一个承诺时thencatch回调,该异常转换为对thencatch方法创建的承诺的拒绝。

因此,您的throw new Error(...)正在拒绝致电then的回复。

浏览器正在更新对未处理的拒绝的处理,以便那些出现在控制台中(目前对此的支持各不相同);可能值得切换到原生承诺。

仅举例说明,这是一个在then回调中抛出本机承诺的示例:

new Promise(function(resolve) {
  console.log("First promise resolving");
  resolve("all good");
}).then(function(resolution) {
  console.log("Got resolution " + resolution);
  console.log("Throwing error from second promise");
  throw new Error("ack!");
});

在最近的Chrome浏览器中,当你运行它时,如果你打开真正的控制台(而不仅仅是in-snippet),你会看到

Uncaught (in promise) Error: ack!(…)

...报告未处理的拒绝。

相比之下,使用jQuery v3.1.1,我没有看到错误:

var d = $.Deferred();
d.promise().then(function(resolution) {
  console.log("Got resolution " + resolution);
  console.log("Throwing error from second promise");
  throw new Error("ack!");
});
console.log("First promise resolving");
d.resolve("all good");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

...这就是为什么切换到原生承诺可能很有用(如果你的项目可行)。