【发布时间】:2022-01-21 21:30:19
【问题描述】:
const errorTest = async() => {
const result = await $.get("http://dataa.fixer.io/api/latest?access_key=9790286e305d82fbde77cc1948cf847c&format=1");
return result;
}
try {
errorTest()
}
catch(err) {
console.log("OUTSIDE ERROR!" + err)
}
该 URL 故意不正确以引发错误,但外部 catch() 它没有捕获它。为什么?
如果我改用then() 和catch(),它会起作用。
errorTest()
.then(val=> console.log(val))
.catch(err=> console.error("ERROR OCCURRED"))
这有效,但try {..} catch() 无效。为什么?
我不断收到Uncaught (in promise) error。
【问题讨论】:
-
您需要
await errorTest()才能在catch块中获得错误。否则你需要附加一个.catch()处理程序。 -
await errorTest()不起作用。它给了我`等待仅在异步函数和模块的顶层主体中有效`错误。catch()处理程序有效,但我不明白为什么。我需要有人更详细地向我解释这一点。我以为使用async会返回一个承诺,那么为什么外面的catch()没有捕捉到它呢? -
@Snirka
then()不返回承诺,而是解决承诺。您的其余评论根本没有解决我的问题。 -
看,如果你执行一个返回promise的函数而你没有
await它,那么稍后会解决。任何处理也将在以后进行。所以one(); try { asyncFn() } catch() {} two();会调用one,然后asyncFn然后不 等待,然后调用two。在这段代码执行完 one(); 之后,无论 promise 发生什么,都将在未来发生。 try { await asyncFn() } catch() {} two();` 将在调用two之前等待来自asyncFn的承诺解决。如果asyncFn导致拒绝,它将进入 catch 块。 -
try/catch在处理承诺方面没有什么特别之处。带有被拒绝承诺的await将引发拒绝,从而触发catch块。
标签: javascript promise try-catch