Javascript 为什么承诺拒绝不在try-catch块中捕获,而是产生未捕获的错误?

Javascript 为什么承诺拒绝不在try-catch块中捕获,而是产生未捕获的错误?,javascript,Javascript,我面临着一个逃避“尝试-抓住”障碍的拒绝承诺。这次拒绝导致了一个意外的例外,这是我无法理解的 如果我在Promise.then或Promise.catch中添加拒绝处理程序,则会捕获拒绝。但我想在这种情况下,试着抓一抓会起作用 这里发生了什么 class-HttpResponse{ json(){ 返回承诺。拒绝('分析错误') } } 函数fetch(){ 返回新的HttpResponse(); } const res=fetch(); 试一试{ res.json().then(json=>

我面临着一个逃避“尝试-抓住”障碍的拒绝承诺。这次拒绝导致了一个意外的例外,这是我无法理解的

如果我在Promise.then或Promise.catch中添加拒绝处理程序,则会捕获拒绝。但我想在这种情况下,试着抓一抓会起作用

这里发生了什么

class-HttpResponse{
json(){
返回承诺。拒绝('分析错误')
}
}
函数fetch(){
返回新的HttpResponse();
}
const res=fetch();
试一试{
res.json().then(json=>{
警报(`json:${json}`);
}
//,原因=>{
//警报(`promise.reject${reason}`);
//}
)
//.catch(原因=>{
//警报(`promise.catch${reason}`);
//})
}捕获(e){
警报(`catch{}from try catch:${e}`);

}
这种行为背后的技术原因是,JavaScript承诺调用两个回调函数中的一个,以决定成功或失败

承诺不会发出尝试工作所需的
错误。它不是一个错误(或者更准确地说)是一个错误实例。它发出一个声音和一个事件。如果需要发出新错误(),建议您发出新错误()。正如这里指出的:https:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/

它会发出一个事件,您可以为其设置处理程序:–


最后,如规范中所述的wait-throws和Error:

Promises有自己的机制,通过
catch()
方法处理错误。
try/catch
块无法控制链接方法时发生的情况

函数fetch(){
return Promise.reject('parse error');
}
const res=fetch();
res.then(json=>{
log(`json:${json}`);
}).catch((e)=>{
log(`catch{}from chained catch:${e}`);

});谢谢,但我需要使用reject或Promise.catch,这是我已经知道的(请参阅注释代码)。我想从技术上解释为什么未捕获异常会逃过try catch如果没有发出错误,为什么我会在控制台中看到未捕获错误消息?这有点违反直觉,请看我的编辑。这应该能清楚地回答你的问题。哇。这是javascript WTF的另一个例子。浏览器似乎捕获了PromisejectionEvent事件,并将其作为错误重新引用(它们在控制台中的显示方式与此类似,并且也结束了nodejs进程)。但在另一方面,如果使用async Wait,那么未处理的承诺拒绝首先会被正确地视为错误。我认为async/await只是一种同步糖。Javascript真的坏了。。。谢谢你的帮助time@DanielSan-我相信这表明了成熟的本质,而不是被打破。此外,规范没有告诉谷歌让V8做任何事情——谷歌决定做自己的事情(其他人也跟着做)。只是想公平一点。如果您真的重视我的时间,请进行一次向上投票。允许在异步等待使用的上下文中使用try-catch捕获错误的技术区别是什么?前一个示例已经内置了
try/catch
机制。这就像有一个嵌套的try/catch。这将只导致内部块捕获错误。后一个例子在使用它自己的机制时抛出错误。所以在异步上下文中
Promise.reject('parse error')
相当于抛出新错误('parse Error')
。这是很明显的。不过还是谢谢你