我的理解是,可以在最终的catch块中捕获调用堆栈中任何地方的一段代码抛出错误。对于获取错误,当没有可用的互联网时,当我在callCallAPI中制作APIwithoutCatch时,未捕获到错误。而APIwithCatch会捕获自己的错误。所有其他错误,例如404,无论我想要在哪里都被捕获。
async function APIwithcatch() {
try {
var response = await fetch("http://wwww.dfdfdf.com/user.json");
return response;
} catch (e) {
console.log(e);
}
}
async function APIwithoutcatch() {
var response = await fetch("http://wwww.dfdfdf.com/user.json");
return response;
}
function callCallAPI() {
try {
// return APIwithcatch();
return APIwithoutcatch();
} catch (e) {
console.log(e);
}
}
callCallAPI();
答案 0 :(得分:1)
APIwithoutcatch
是async function
-它不会引发异常,而是会拒绝它返回的承诺。您需要使用then
或await
语法来等待诺言(就像您在await
中对fetch
所做的APIwithcatch
一样):
async function API() {
return fetch("http://wwww.example.com/user.json");
}
function callAPI() {
try {
await API();
} catch (e) {
console.log(e);
}
}
callAPI();
答案 1 :(得分:0)
Per MDN, fetch()API仅在遇到“网络错误时才拒绝承诺,尽管这通常意味着权限问题或类似问题。”基本上,fetch()仅在用户离线时拒绝承诺,或发生一些不太可能的网络错误,例如DNS查找失败。
但是,获取操作提供了一个ok标志,我们可以使用它来检查HTTP状态代码是否成功以及await response.json()
用户定义的异常
throw
将从响应中提取JSON正文内容,因此我们可以将其.catch
放入 async function APIwithcatch() {
try {
var response = await fetch("http://wwww.dfdfdf.com/user.json");
if (!response.ok) throw await response.json();
return response;
} catch (e) {
console.log(e);
}
}
块。
{{1}}
答案 2 :(得分:-1)
UPD:遇到问题了,很遗憾,您无法捕获代码中的错误
抓取是异步的,因此您不能使用try {} catch {}
构造,而应使用.then().catch()
:
async function APIwithoutcatch() {
var response = await fetch("http://wwww.dfdfdf.com/user.json");
return response;
}
function callCallAPI() {
return APIwithoutcatch()
.then((data) => {
console.log(data)
})
.catch((e) => {
console.log(e)
})
}
callCallAPI();