首页 > 解决方案 > 为什么在 try catch 块中没有捕获 promise 拒绝但会产生 Uncaught 错误?

问题描述

我正面临一个逃避 try catch 块的承诺拒绝。拒绝会导致未捕获的异常,这是我无法理解的。

如果我在 Promise.then 或 Promise.catch 中添加拒绝处理程序,则会捕获拒绝。但我希望 try catch 能在这种情况下工作。

这里发生了什么?

class HttpResponse {
    json() {
        return Promise.reject('parse error')
    }
}

function fetch() {
        return new HttpResponse();
}


const res = fetch();

try {
    res.json().then(json => {
        alert(`json: ${json}`);
    }
    //,reason => {
    //    alert(`promise.reject ${reason}`);
    //}
    )
    //.catch(reason => {
    //    alert(`promise.catch ${reason}`);
    //})
} catch (e) {
    alert(`catch{} from try catch: ${e}`);
}

标签: javascript

解决方案


这种行为背后的技术原因是因为 JavaScript 承诺调用成功或失败的两个回调函数之一。

承诺不会发出Error尝试工作所需的内容。它不是错误(或更技术上更准确)的错误实例。它发出和事件。如果您需要发出一个新的 Error(),我们鼓励您发出一个。正如这里所指出的:https:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…</p>

它发出一个事件,您可以为其设置处理程序:https ://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent –</p>

最后,按照规范中的描述等待抛出和错误:https ://tc39.es/ecma262/#await-rejected


推荐阅读