Как поймать NetworkError в JavaScript?

В консоли 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

Как я могу поймать NetworkError?

Ответ 1

Я думаю, что вы имели в виду:

if(exception.name == 'NetworkError'){
   console.log('There was a network error.');
}

Я не верю, что Ошибка является экземпляром NetworkError, но брошена таким образом:

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

Ответ 2

Я нашел этот ответ, когда искал способ проверить Network Error полученную при использовании Axios, поэтому, если вы не используете Axios, этот ответ, вероятно, не для вас.

Объект ошибки, который я получаю через Axios, имеет атрибуты config, request и response, а request и response имеют атрибут status. Атрибут объекта response отображается на изображении ниже:

error.response object from Axios

Моя конфигурация 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
}

Ответ 3

Просмотрите событие onreadystatechange. Вы можете получить статус ответа.

Ответ 4

exception.name возвращает "Error" даже при сетевых ошибках лучшим способом может быть проверка, если ошибка имеет конфигурацию URL, как это:

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