es6承诺吞咽类型错误

时间:2015-10-27 18:55:56

标签: javascript es6-promise

我希望浏览器在发生类型错误时显示错误消息 之类的错误无​​法读取未定义的属性未定义的引用

new Promise(function(resolve,reject){
    // do stuff ...
    reject('something logical is wrong');
}).catch(e => console.error(e));

new Promise(function(resolve,reject){
    // do stuff, and a syntax error :/
    var a = { };
    a.something.otherthing = 1; /* we have an error here */
    // ... 
}).catch(e => console.error(e));

在第一个例子中,错误是合乎逻辑的,在 catch(..)块中捕捉它很好。
但在第二个例子中,它是一个明显的开发错误,它在开发新东西时一直发生。我不想抓住它,我希望浏览器像控制台中的其他错误一样向我显示错误。 我希望能够在异常上启用 chrome暂停,并查看其他变量的状态。我想在控制台中看到堆栈跟踪 我希望它像正常错误一样。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

与同步代码中的异常不同,一旦代码返回到 idle ,它就变为未被捕获,浏览器通常不知道promise链的逻辑结尾,这是异步错误可被视为未被捕获的地方。链条毕竟是动态组合的,因此最好在链的逻辑端使用最终.catch终止,即异步等效于空闲。

拥有最终.catch(e => console.error(e))对我来说似乎非常合理,但你认为浏览器倾向于以未捕获的异常显示这些错误。如果你想让它们看起来一样,你可以使用这个技巧:

.catch(e => setTimeout(() => { throw e; }))

这会抛出e,包含原始堆栈跟踪和行号,在下一个周期和promise链之外,没有任何东西可以捕获它,它将被报告为未捕获。我们使用setTimeout来克服.catch的默认行为,即在您打算继续链接的情况下捕获链中的任何异常。

有了这个,我希望你看到“逻辑”和其他错误之间的区别是无关紧要的。任何使它成为链尾的错误对于链是致命的,即未被捕获(当然,你可以从最终捕获中的其他错误中分类“逻辑”,如果你选择则以不同的方式显示它们。 )

答案 1 :(得分:2)

chrome 来源标签中有暂停捕获例外选项,我启用了该选项,暂停例外功能现在正常运作。