【问题标题】:Axios.catch does not catch network/console errors [duplicate]Axios.catch 不捕获网络/控制台错误 [重复]
【发布时间】:2019-03-16 04:31:09
【问题描述】:

我正在使用带有 axios 和 redux-promise 的 React。 Axios 似乎没有捕获 404 错误,如下所示。

这是代码。

 const url = FIVE_DAY_FORECAST_URL.replace("{0}", city);

  axios.interceptors.response.use(function (response) {
    return response;
  }, function (error) {
     return Promise.reject(error);
  });

  try{
    const request = axios.get(`${url}`).then(e => { 
       debugger; }).catch(
      e => {
        debugger;
        return "ERROR"; // THIS FIRES, BUT DOES NOT STOP THE CONSOLE ERROR
      });
      debugger;
    return {
      type: FETCH_FIVE_DAY_FORECAST,
      payload: request
    };
  } catch {
    debugger;
    console.log("Error!");  // DOES NOT HELP AS THE 404 IS NOT A JAVASCRIPT ERROR, IT'S A VALID SERVER RESPONSE
  }
}

我正在使用多种技术来捕获控制台错误:

  • .then() ==> 代码运行通过这个块,但是错误已经发生,并且已经写入控制台!

  • .catch() ==> 如果未配置拦截器,即注释掉 axios.interceptors.response.use...,代码将通过此块运行。

  • try...catch ==> 无效(不捕获网络响应,因为这不是真正的 javascript 错误!)

【问题讨论】:

  • 它只是在调试控制台上显示一条消息,但这不是错误,也不会中断您的代码执行。您的代码似乎按预期工作,而该日志消息真的是个问题?
  • 同意,它“有效”,但环境被红色污染,这并不是真正的应用程序错误情况。随着这个应用程序的增长,我不希望它在没有任何错误的情况下标记噪音。
  • @Banoona 然后不要尝试获取不存在的资源,或者当您的意思不同时不要发送 404 错误。顺便说一句,您可以在控制台中隐藏消息。
  • 谢谢@Bergi。不过,这并不是问题的真正答案。是的,我可以限制选项(例如通过下拉列表)。但这不是重点。 javascript 接口应该能够优雅地捕获 404 错误。 “找不到”是一个有效的响应,所以我应该能够捕捉到它并向用户显示“找不到位置”(控制台日志中没有任何噪音)另外,这不是我的 API,所以我无法控制状态返回代码。
  • @Banoona 您的 javascript 可以并且确实捕获 404 错误,您可以随意处理它(向用户显示消息)。这与控制台是否有用无关。用户不关心控制台日志。

标签: javascript reactjs axios


【解决方案1】:

当使用try...catchaxios 时,您必须明确声明错误响应,像这样

catch(error) {
  console.log('[error]', error.response);
  // use the error.response object for some logic here if you'd like
}

否则只返回字符串值。

使用该响应对象,您可以利用一些逻辑来根据特定错误执行某些操作。更多信息可以在这里找到https://github.com/axios/axios/issues/960

我希望这会有所帮助。

【讨论】:

  • 嗨,马克。谢谢,但不确定这是否真的解决了问题。问题是 catch 语句不会抑制登录到控制台的红色错误消息(这发生在它进入 catch 块之前,因此不在我的控制范围内)
【解决方案2】:

您正在尝试捕获 Promise.reject 并将其包装在 try...catch 中。只有其中一个会起作用。

您可以捕获一个 Promise 拒绝或将 Promise 包装在 try...catch 中,然后在 Promise 拒绝时抛出一个新错误并将其捕获到 catch 块中。

试试这个代码

const url = FIVE_DAY_FORECAST_URL.replace("{0}", city);

axios.interceptors.response.use(function (response) {
  return response;
}, function (error) {
   return Promise.reject(error);
});

try {
  const request = axios.get(`${url}`)
  .then(
    response => {
      debugger;
    })
    .catch(
    e => {
      debugger;
      throw e // throw the error and catch it
    });
    debugger;
  return {
    type: FETCH_FIVE_DAY_FORECAST,
    payload: request
  };
} catch {
  debugger;
  // Now you can catch the error in catch block
  console.log("Error!");
}

// or you can't write async/await code
// make the the function is marked as `async`

try {
  const response = await axios.get(`${url}`)
  return {
    type: FETCH_FIVE_DAY_FORECAST,
    payload: response
  };
} catch (e) {
  console.error("Error happened during fetch");
  console.error(e);
}

【讨论】:

  • 异步的不起作用:控制台仍然记录 404,我们得到:redux.js:192 Uncaught (in promise) 错误:操作必须是普通对象。使用自定义中间件进行异步操作。在调度时 (redux.js:192) 在 index.js:57 在调度时 (redux.js:613)
  • 你的第一个也没有发现错误。 Chrome 在被 javascript 代码捕获之前将其记录为网络错误。
猜你喜欢
  • 2023-04-08
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多