如何在JavaScript中捕获NetworkError?

如何在JavaScript中捕获NetworkError?,javascript,xmlhttprequest,referenceerror,Javascript,Xmlhttprequest,Referenceerror,在Chrome的JavaScript控制台中,如果我运行以下命令: var that = new XMLHttpRequest(); that.open('GET', 'http://this_is_a_bad_url.com', false); that.send(); 我得到一个故意预期的错误: NetworkError: A network error occurred. 我想抓住这个,所以我使用: var that = new XMLHttpRequest(); that.open(

在Chrome的JavaScript控制台中,如果我运行以下命令:

var that = new XMLHttpRequest();
that.open('GET', 'http://this_is_a_bad_url.com', false);
that.send();
我得到一个故意预期的错误:

NetworkError: A network error occurred.
我想抓住这个,所以我使用:

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.');
  }
}
但是,我得到一个关于未定义NetworkError的错误:

ReferenceError: NetworkError is not defined

我怎样才能抓住网络错误?

我想你的意思是:

if(exception.name == 'NetworkError'){
   console.log('There was a network error.');
}
我不认为该错误是NetworkError的实例,但以以下方式抛出:

throw {
   name: 'NetworkError',
   message: 'A network error occurred.'
   // etc...
}

调查这件事。您可以获取响应的状态。

我在寻找检查使用Axios时出现的
网络错误的方法时找到了这个答案,因此如果您不使用Axios,这个答案可能不适合您

我通过Axios接收的错误对象具有
config
request
response
属性,并且
request
response
都具有
status
属性<代码>响应
对象的属性显示在下图中:

我的axios配置如下所示:

this.client = axios.create(options);
this.client.interceptors.response.use(this.handleSuccessResponse, this.handleErrorResponse);
this.unauthorizedCallback = () => {};
handleErrorResponse
方法是:

handleErrorResponse(error) {
  // use the information from the error object here
}

编辑:根据以下建议:


如果您使用的是axios和nginx,这可能是您的评论。我遇到了
错误的问题。响应
未定义
结果是因为CORS问题。必须将我的nginx config设置为关键字始终添加适当的头来解决CORS,否则头会在错误响应时被剥离,所以CORS问题会出现。有关更多信息,请参阅。

异常。即使出现网络错误,name也会返回“Error”
更好的方法是检查错误是否具有如下url配置:

if(exception.config && exception.config.url){
  // network error
} else {
  // other errors
}

readystate在调用send()之后才会更改,但是send()调用是产生异常的原因。这非常有效。我还应该问:在Chrome的JS控制台中,它仍然显示“GET(url)”,左侧有一个红色的X,同时在控制台的右下角统计错误。还有什么方法可以捕捉到这一点吗?Afaik chrome控制台以这种方式显示所有失败的请求,捕捉到错误将防止在Firefox中破坏您的代码错误的名称是
TypeError
,但消息说
NetworkError当尝试获取资源时
FWIW,我的axios网络错误的请求状态为0,并且响应对象未定义。@DylanSmith您确定签入的位置正确吗?还是用正确的方法抓住它?我想是的。我正在处理的情况是,服务器不可访问(类似于OP),因此没有响应,因此它可能是未定义的。好吧,这是一个特殊情况,您现在知道如何处理:)@DylanSmith Upvote。你说得对。答案不适用于axios,因为
result。对于有axios错误的我来说,name
始终是
“Error”
。检查
result.response
是否未定义适用于检查第5层以下的网络错误。此外,结果还包含布尔值
isAxiosError