如何在JavaScript中捕获NetworkError?

Syn*_*ead 16 javascript xmlhttprequest referenceerror

在Chrome的JavaScript控制台中,如果我运行它:

var that = new XMLHttpRequest();
that.open('GET', 'http://this_is_a_bad_url.com', false);
that.send();
Run Code Online (Sandbox Code Playgroud)

我得到了一个故意预期的错误:

NetworkError: A network error occurred.
Run Code Online (Sandbox Code Playgroud)

我想抓住这个,所以我使用:

var that = new XMLHttpRequest();
that.open('GET', 'http://this_is_a_bad_url.com', false);
try {
  that.send();
} catch(exception) {
  if(exception instanceof NetworkError) {
    console.log('There was a network error.');
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个关于未定义NetworkError的错误:

ReferenceError: NetworkError is not defined
Run Code Online (Sandbox Code Playgroud)

我怎样才能捕获NetworkError?

Rob*_* M. 15

我想你的意思是:

if(exception.name == 'NetworkError'){
   console.log('There was a network error.');
}
Run Code Online (Sandbox Code Playgroud)

我不相信Error是一个实例NetworkError,但是以这种方式抛出:

throw {
   name: 'NetworkError',
   message: 'A network error occurred.'
   // etc...
}
Run Code Online (Sandbox Code Playgroud)

  • 在 Firefox 中,错误的名称是“TypeError”,但消息显示“尝试获取资源时出现 NetworkError” (4认同)
  • Afaik chrome控制台以这种方式显示所有失败的请求,捕获错误将防止破坏您的代码 (2认同)

Ale*_*dar 7

我在寻找一种方法来检查Network Error我在使用 Axios 时得到的答案时找到了这个答案,所以如果您使用 Axios,这个答案可能适合您。

\n\n

我通过 Axios 收到的错误对象具有config和属性,并且 和request都具有属性。对象的属性如下图所示:responserequestresponsestatusresponse

\n\n

来自 Axios 的 error.response 对象

\n\n

我的 axios 配置如下所示:

\n\n
this.client = axios.create(options);\nthis.client.interceptors.response.use(this.handleSuccessResponse, this.handleErrorResponse);\nthis.unauthorizedCallback = () => {};\n
Run Code Online (Sandbox Code Playgroud)\n\n

方法handleErrorResponse是:

\n\n
handleErrorResponse(error) {\n  // use the information from the error object here\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

编辑:按照@Erd\xc5\x91s-Bacon的建议:

\n\n

如果您使用 axios 和 nginx,这可能是给您的评论。我遇到了问题error.responseundefined结果发现这是因为 CORS 问题。必须将我的 nginx 配置设置为关键字“始终添加适当的标头”来解决 CORS,否则标头会在错误响应时被删除,从而出现 CORS 问题。请参阅此答案以获取更多信息。

\n

  • FWIW,我的 axios 网络错误的请求状态为 0,并且响应对象未定义。 (3认同)
  • @DylanSmith 投票。你说得对。答案不适合 axios,因为对于我来说,带有 axios 错误的“result.name”始终是“Error”。检查 `result.response` 是否未定义适合检查第 5 层以下的网络错误。结果还包含布尔值 `isAxiosError`。 (2认同)