powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Перехват ошибки в асинхронном XMLHttpRequest
12 сообщений из 12, страница 1 из 1
Перехват ошибки в асинхронном XMLHttpRequest
    #39933016
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
let $xhr = new XMLHttpRequest();
...
$xhr.open($method, $url);
try {
	$xhr.send($data);
} catch($err) {
	console.log($err);
}


Если в этот код передать заведомо недопустимый адрес (например " http://0.0.0.0"), то ошибка не перехватывается, а вместо этого исключение ERR_ADDRESS_INVALID выбрасывает браузер.
Предполагаю, что из-за асинхронного режима, т.к. читал, что try/catch работает только в синхронном коде.
А как перехватывать такие ошибки?
Обработчик onerror у XMLHttpRequest задан, он срабатывает, но из него я не могу определить причину ошибки.
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933278
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
А как перехватывать такие ошибки?

А стандартный вариант обработки не срабатывает?
https://learn.javascript.ru/ajax-xmlhttprequest
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933296
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартный это как? В синхронном режиме?
В синхронном режиме try/catch работает нормально.
В асинхронном режиме в момент выполнения send ошибок не происходит, однако спустя доли секунды браузер показывает в консоли исключение (после того как отработает onerror).
То есть ошибку я поймать могу, но при этом исключение не перехватывается, а попадает уровнем выше (в браузер).
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933301
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Стандартный это как?

Там же и пример есть...

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
// 4. Если код ответа сервера не 200, то это ошибка
if (xhr.status != 200) {
  // обработать ошибку
  alert( xhr.status + ': ' + xhr.statusText ); // пример вывода: 404: Not Found
} else {
  // вывести результат
  alert( xhr.responseText ); // responseText -- текст ответа.
}
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933335
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
В асинхронном режиме в момент выполнения send ошибок не происходит, однако спустя доли секунды браузер показывает в консоли исключение (после того как отработает onerror).

Есть пример и для асинхронной обработке...

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var xhr = new XMLHttpRequest();
xhr.open('GET', 'phones.json', true);
xhr.send(); // (1)
xhr.onreadystatechange = function() { // (3)
  if (xhr.readyState != 4) return;
  button.innerHTML = 'Готово!';
  if (xhr.status != 200) {
    alert(xhr.status + ': ' + xhr.statusText);
  } else {
    alert(xhr.responseText);
  }

}
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933364
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне казалось, что я написал, в чем сложности.
В асинхронном режиме у меня обработчики onerror (или onreadystatechange) и так работают.
Но при этом в браузере (в консоли разработчика) все равно выбрасывается исключение, оно не перехватывается catch.
Диаграмма получается следующая:
1) .open в асинхронном режиме
2) .send внутри try выполняется успешно, исключение не происходит
3) .onerror, в котором я получаю событие с типом error
4) в консоли браузера происходит исключение на строке с .send, и оно НЕ обрабатывается в catch

Проблемы тут две.
Во-первых, в onerror я не получаю информации об ошибке. Например для заведомо неверного URL выбрасывается исключение ERR_ADDRESS_INVALID, однако в обработчике этой информации нигде нет, об ошибке можно судить только по status=0. В синхронном режиме эта ошибка передается в catch (в переменной $err), но в onerror она не передается.
Во-вторых, исключение не перехватывается, а попадает в браузер (несмотря на catch). Как его погасить?
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933442
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B. , кроме обработчика onreadystatechange в асинхронном вызове больше ничего нет...

Как вариант, использовать setTimeout() и там запускать синхронный запрос с твоей обработкой...
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933463
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы предпочел не использовать синхронные запросы.
Хром (и не только) ругается, что они depricated.
И возможно, что через какое-то время они вообще перестанут работать.
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933465
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Я бы предпочел не использовать синхронные запросы.

Значит выбор у тебя не велик...
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933684
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может в Promise все это загнать.
Он вроде должен все ошибки перехватывать.
Типа этого

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
new Promise ((res, rej) => {
	$xhr.onreadystatechange = () => { /
	  if ($xhr.readyState != 4) return;
	  if ($xhr.status != 200) {
		rej ({status: $xhr.status, text: $xhr.statusText});
	  } else {
		res ($xhr.responseText);
	  }
	}
	$xhr.send($data)
})
.then (response => {
 // Здесь обрабатываем успешный ответ, он в response
})
.catch (err => {
// Тут обрабатываем ошибку
	if ('status' in err && 'text' in err) {
		// это ошибка посланная из onreadystatechange
	} else {
	    // какая то другая ошибка
	}
})
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933692
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сварщик ненастоящий.
Концепцию promise пока понимаю не очень.
Но в этом случае разве не лучше использовать fetch?
...
Рейтинг: 0 / 0
Перехват ошибки в асинхронном XMLHttpRequest
    #39933702
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,
Я его и использую обычно. Но он не работает в ИЕ 11-.
Если они не нужны, то конечно лучше.
Он возвращает Promise и ошибки нормально ловятся через .catch (метод Promise, а не тот, который у try)

ЗЫ А Promise у ИЕ 11- тоже нет.
Но помнится, был полифил какой то.
Я его использовал когда то, как раз с XMLHttpRequest, но на все возможные ошибки не тестировал.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Перехват ошибки в асинхронном XMLHttpRequest
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]