此代码不会导致“未捕获的承诺”异常:
// Called from top level code;
// implicitly returns a Promise
testRejectCatch = async function() {
// Nested within testRejectCatch;
// simply rejects immediately
let testReject = function() {
return new Promise(function(resolve, reject) {
reject('test the reject');
)};
}
//***********************************************
// testRejectCatch entry.
//***********************************************
try {
await testReject(); // implicitly throws reject exception
catch(error) {
// somecode
}
//***********************************************
// top level code
//***********************************************
try{
testRejectCatch() // Promise implicitly returned,
.catch((error) => { // so we can catch
window.alert('Report error: ' + error);
// must not throw error;
});
}
catch(error) {
// some code
}
解释:首先,有一个术语问题。术语“catch”以两种方式使用:在 try-catch 中和在 Promise 中。因此,很容易对“投掷”感到困惑;它是投掷到try's catch还是Promise's catch?
答:testReject 中的reject 是抛给Promise 的隐式catch,在await testReject;然后在 testRejectCatch() 处抛出 .catch。
在这种情况下,try-catch 是无关紧要的,被忽略了;投掷与他们无关。
testRejectCatch 处的 .catch 满足原始 throw 必须在某处捕获的要求,因此您不会遭受“在 Promise 中未捕获...”异常。
要点:Promises 的 throws 是 throws 到 .catch,而不是 try-catch;并且必须在某些 .catch 中处理
编辑:在上面的代码中,拒绝通过 .catch 向上传播。如果你愿意,你可以转换为传播 try-catch。在第 17 行,将代码更改为:
let bad = '';
await testReject().catch((error) => {bad = error});
if (bad) throw bad;
现在,您已切换到 try-catch。