抓取错误

时间:2018-08-22 10:01:31

标签: javascript promise async-await try-catch fetch

我的理解是,可以在最终的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();
我的假设是任何错误都应沿着调用堆栈流下来,这是正确还是错误? net :: ERR_INTERNET_DISCONNECTED错误有什么特殊之处?

3 个答案:

答案 0 :(得分:1)

APIwithoutcatchasync function-它不会引发异常,而是会拒绝它返回的承诺。您需要使用thenawait语法来等待诺言(就像您在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();