es6 承诺 swallow 类型错误

es6 promises swallow type errors

我希望浏览器在发生类型错误时显示错误消息。
cannot read 属性 something of undefinedundefined reference.

这样的错误
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(..) 块中 catch 它.
但在第二个例子中,这是一个明显的开发错误,在开发新东西时经常发生。我不想捕捉到它,我希望浏览器像控制台中的其他错误一样向我显示错误。 我希望能够打开 chrome 异常暂停 并查看其他变量的状态。我想在控制台中查看堆栈跟踪。
我希望它表现得像 正常 错误。

有什么想法吗?

chromeSources 选项卡中有一个选项 Pause on Caught Exceptions ,我启用了该选项并且 出现异常时暂停 功能现在工作正常。

与同步代码中的异常不同,一旦代码 returns 变为 idle,浏览器通常不会 uncaught不知道 promise 链的逻辑末端,即 异步错误 可以被视为未捕获的地方。毕竟链是动态组装的,因此最好在链的逻辑末端用最终的 .catch 终止,即空闲的异步等价物。

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

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

这将在下一个循环中抛出 e,其中包含原始堆栈跟踪和行号,并且在承诺链之外,在那里没有任何东西会捕获它,它将被报告为未捕获。我们使用 setTimeout 来克服 .catch 的默认行为,即在您打算继续链接时捕获链中的任何异常。

有了这个,我希望你明白 "logical" 和其他错误之间的任何区别都是无关紧要的。任何到达链尾的错误对链来说都是致命的,即 uncaught(当然你可以从最终捕获的其他错误中分类 "logical" 并显示它们如果您选择不同。)