ES6 Promise会忽略类型错误

6

当类型错误发生时,我希望浏览器显示错误消息。
例如:无法读取未定义的某个属性未定义的引用

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暂停异常并查看其他变量的状态。我希望在控制台中看到堆栈跟踪信息。
我希望它表现得就像一个普通的错误一样。
有什么好的主意吗?

使用您的第二个示例,我在控制台中收到以下错误 TypeError: Cannot set property 'otherthing' of undefined。这不是您想要发生的吗?承诺保持挂起状态,但这是另一个问题。 - An0nC0d3r
我想要错误的行号和堆栈跟踪。 - Amin Roosta
1
就你的例子而言,我在Chrome和Firefox控制台中都能得到“TypeError”的行号,在Firefox中我还能得到控制台中的堆栈跟踪。 - jib
这不是语法错误,而是“TypeError”。您可能想编辑问题的标题。 - user663031
@torazaburo 谢谢,已完成。 - Amin Roosta
显示剩余2条评论
2个回答

5
与同步代码中的异常不同,一旦代码返回到空闲状态,异常就会变成“未捕获的异常”,而浏览器通常无法知道Promise链的逻辑终点,这就是异步错误可能被认为是未捕获的地方。毕竟,链是动态组装的,因此最好在链的逻辑末端即链的异步等效空闲处使用最终的.catch。
对我来说,有一个最终的.catch(e => console.error(e))非常合理,但是你是正确的,浏览器倾向于以与未捕获异常不同的方式显示这些错误。如果您想让它们看起来相同,可以使用以下技巧:
.catch(e => setTimeout(() => { throw e; }))

这将在下一个循环周期中抛出包含原始堆栈跟踪和行号的 e,并且在 Promise 链之外,没有任何东西可以捕获它,并且它将报告为未捕获的异常。我们使用 setTimeout 来克服 .catch 的默认行为,后者是在您打算继续链接的情况下捕获链式中的任何异常。通过这样做,我希望您看到“逻辑”错误和其他错误之间的任何区别都是不相关的。任何到达链尾的错误都对链进行了致命的影响,即未捕获(当然,您可以在最后一个 catch 中对 “逻辑” 错误与其他错误进行分析并选择不同的显示方式)。

2

Chrome资源选项卡中有一个暂停捕获的异常选项,我启用了该选项,现在异常暂停功能运作良好。


1
这将在逻辑错误和“TypeError”上暂停,因此似乎不符合您自己的问题标准。 - jib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接