Javascript 捕获获取错误

Javascript 捕获获取错误,javascript,promise,async-await,try-catch,fetch,Javascript,Promise,Async Await,Try Catch,Fetch,我的理解是,在调用堆栈的任何地方抛出错误的代码片段都可以在最终的catch块中被捕获。对于fetch error,当没有可用的internet时,当我在CallAPI中生成APIwithoutCatch时,不会捕获错误。而APIwithCatch捕捉到自己的错误。所有其他错误(如404)都会在两个位置捕获,无论我想在哪里 异步函数APIwithcatch{ 试一试{ var响应=等待fetchhttp://wwww.dfdfdf.com/user.json; 返回响应; }抓住e{ conso

我的理解是,在调用堆栈的任何地方抛出错误的代码片段都可以在最终的catch块中被捕获。对于fetch error,当没有可用的internet时,当我在CallAPI中生成APIwithoutCatch时,不会捕获错误。而APIwithCatch捕捉到自己的错误。所有其他错误(如404)都会在两个位置捕获,无论我想在哪里

异步函数APIwithcatch{ 试一试{ var响应=等待fetchhttp://wwww.dfdfdf.com/user.json; 返回响应; }抓住e{ console.loge; } } 异步函数APIwithoutcatch{ var响应=等待fetchhttp://wwww.dfdfdf.com/user.json; 返回响应; } CallAPI函数{ 试一试{ //带捕回; 无渔获物返回; }抓住e{ console.loge; } }
CallAPI UPD:有您的问题,不幸的是,您无法捕获代码中的错误

Fetch是异步的,因此不能使用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();

UPD:有您的问题,不幸的是,您无法捕获代码中的错误

Fetch是异步的,因此不能使用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();
APIwithoutcatch是一个异步函数——它不会抛出异常,而是拒绝它返回的承诺。您需要使用then或wait语法等待承诺,就像您在APIwithcatch中等待获取一样:

APIwithoutcatch是一个异步函数——它不会抛出异常,而是拒绝它返回的承诺。您需要使用then或wait语法等待承诺,就像您在APIwithcatch中等待获取一样:

fetch API仅在“遇到网络错误时拒绝承诺,尽管这通常意味着权限问题或类似问题。”基本上,fetch仅在用户脱机或出现一些不太可能的网络错误(如DNS查找失败)时拒绝承诺

然而,fetch提供了一个ok标志,我们可以使用它来检查HTTP状态代码是否成功,并抛出一个用户定义的异常

await response.json将从响应中提取json正文内容,以便我们可以将其抛出到.catch块

fetch API仅在“遇到网络错误时拒绝承诺,尽管这通常意味着权限问题或类似问题。”基本上,fetch仅在用户脱机或出现一些不太可能的网络错误(如DNS查找失败)时拒绝承诺

然而,fetch提供了一个ok标志,我们可以使用它来检查HTTP状态代码是否成功,并抛出一个用户定义的异常

await response.json将从响应中提取json正文内容,以便我们可以将其抛出到.catch块


js fetchurl,requestConfig.thenresponse=>handleApiResponseresponse,…args.catcherr=>console.error;此代码捕获类型错误:在没有internet的情况下尝试时无法获取。js try{var response=fetchurl,requestConfig return response}catch{console.loge}此抛出uncaughtPromiseRejection错误。所有其他错误(如404)都在这两个位置被捕获-您没有在任何地方处理状态代码,是什么让您认为这是一个错误?确保404网络请求单独显示在控制台中,但您并不是从您发布的代码中记录它。这里有一个要点,我是根据我在项目中使用的代码创建的。它可能不起作用,但会给你更多的细节。我看不出这与你问题中的代码有什么关系。你是如何调用postAPI的,你期望什么,当你得到哪个响应时,什么不起作用?当我调用postAPI,而internet不在那里时,我无法捕获错误。js fetchurl,requestConfig.thenresponse=>handleApiResponseresponse,…args.catcherr=>console.errorerr;此代码捕获类型错误:在没有internet的情况下尝试时无法获取。js try{var response=fetchurl,requestConfig return response}catch{console.loge}此抛出uncaughtPromiseRejection错误。所有其他错误(如404)都在这两个位置被捕获-您没有在任何地方处理状态代码,是什么让您认为这是一个错误?确保404网络请求单独显示在控制台中,但您并不是从您发布的代码中记录它。这里有一个要点,我是根据我在项目中使用的代码创建的。它可能不起作用,但会给你更多的细节。我看不出这与你问题中的代码有什么关系。你是如何调用postAPI的,你期望什么,当你得到响应时,什么不起作用?当我调用postAPI时,互联网不在那里,我无法捕获错误。问题只在于net::ERR\u internet\u断开连接错误。当没有连接时,promise能够生成错误,但try/catch块不能。我只是想了解发生了什么?我知道你的问题,所以我更新了答案。您可以使用axios而不是fetch顺便说一句,这将解决
你的问题,我明白解决办法。我知道。我只是想知道为什么try/catch with async/await在这种情况下不起作用。这可能是因为错误和异常之间的差异,或者与Promise.reject的工作方式有关。我只是想知道这一点。它不起作用,因为在callapi中尝试body会返回承诺。您还可以使CallAPI异步,并执行类似于try{var res=await APIwithoutcatch;return res;}的操作。问题只存在于net::ERR_interneth_DISCONNECTED error。当没有连接时,promise能够生成错误,但try/catch块不能。我只是想了解发生了什么?我知道你的问题,所以我更新了答案。顺便说一句,你可以用axios代替fetch,这会解决你的问题。我了解解决方法。我知道。我只是想知道为什么try/catch with async/await在这种情况下不起作用。这可能是因为错误和异常之间的差异,或者与Promise.reject的工作方式有关。我只是想知道这一点。它不起作用,因为在callapi中尝试body会返回承诺。您还可以使callapi异步,并执行类似于try{var res=wait APIwithoutcatch;return res;}
    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);
      }
    }