我希望浏览器在发生类型错误时显示错误消息 之类的错误无法读取未定义的属性或未定义的引用。
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暂停,并查看其他变量的状态。我想在控制台中看到堆栈跟踪
我希望它像正常错误一样。
有什么想法吗?
答案 0 :(得分:5)
与同步代码中的异常不同,一旦代码返回到 idle ,它就变为未被捕获,浏览器通常不知道promise链的逻辑结尾,这是异步错误可被视为未被捕获的地方。链条毕竟是动态组合的,因此最好在链的逻辑端使用最终.catch
终止,即异步等效于空闲。
拥有最终.catch(e => console.error(e))
对我来说似乎非常合理,但你认为浏览器倾向于以未捕获的异常显示这些错误。如果你想让它们看起来一样,你可以使用这个技巧:
.catch(e => setTimeout(() => { throw e; }))
这会抛出e
,包含原始堆栈跟踪和行号,在下一个周期和promise链之外,没有任何东西可以捕获它,它将被报告为未捕获。我们使用setTimeout
来克服.catch
的默认行为,即在您打算继续链接的情况下捕获链中的任何异常。
有了这个,我希望你看到“逻辑”和其他错误之间的区别是无关紧要的。任何使它成为链尾的错误对于链是致命的,即未被捕获(当然,你可以从最终捕获中的其他错误中分类“逻辑”,如果你选择则以不同的方式显示它们。 )
答案 1 :(得分:2)
chrome 在来源标签中有暂停捕获例外选项,我启用了该选项,暂停例外功能现在正常运作。