Кто-нибудь когда-нибудь успешно отслеживал необработанное исключение во время запроса ajax?

Как ajax узнает, произошел ли сбой или успех, если серверная сторона ничего не возвращает?

$.ajax(error:..,success:..)

Я встретил это исключение в своем тесте:

необработанное исключение: [Исключение... «Компонент вернул код ошибки: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.statusText]» nsresult: «0x80040111 (NS_ERROR_NOT_AVAILABLE)» местоположение: «JS-кадр :: http://localhost/script/tab.js :: анонимно :: строка 69" данные: нет]

Код на стороне сервера:

$id = process();

И в целях тестирования у меня есть exit() в процессе();

Является ли это причиной этого исключения? Если да, то почему?

EDIT Я просмотрел строку, которая вызывает исключение, это функция обработки ошибок $.ajax()

error:function(XMLHttpRequest, textStatus, errorThrown){ 
    alert(XMLHttpRequest.statusText);alert(textStatus);alert(errorThrown);
}

Что-то не так?


person omg    schedule 21.09.2009    source источник
comment
Я удалил $id =, и он по-прежнему сообщает об этом исключении. Почему нельзя вызвать exit()?   -  person omg    schedule 21.09.2009
comment
Что вы ожидаете от «exit()»?   -  person ijw    schedule 21.09.2009
comment
Полный ответ длинный, я вызываю exit(), чтобы обрезать результат.   -  person omg    schedule 21.09.2009
comment
И, перепроверив вашу ошибку, где в вашем Javascript возникает исключение? В вызове $.ajax()? Где-нибудь еще? Можете ли вы предоставить трассировку стека?   -  person ijw    schedule 21.09.2009
comment
Это происходит в функции обработки ошибок вызова $.ajax().   -  person omg    schedule 21.09.2009


Ответы (7)


httprequest также возвращает статус, такой как 200 == ok, 404 == not found, 12152 == соединение закрыто сервером и т. д. Просто прочитайте идентификаторы статуса, что они означают, чтобы вы могли найти их. вы также можете по причинам отладки просто записать myhttprequest.status в документ, и он покажет, какой статус он вернул.

person Jonas B    schedule 21.09.2009

Это зависит от кода состояния, который возвращает запрос. Успешный запрос возвращает код состояния в диапазоне 2xx, ошибка находится в диапазоне от 4xx до 5xx.

Для получения дополнительной информации см. Википедия: Список кодов состояния HTTP.

person Edwin V.    schedule 21.09.2009
comment
Это переменная заголовка, которую вам нужно отправить вместе с вашим ответом. Например, в PHP вы можете сделать заголовок (HTTP/1.0 404 Not Found);, который является ответом с кодом состояния 404. - person Edwin V.; 22.09.2009

Он все равно получит ответ от сервера, а часть данных будет пустой. Если бы он вообще не получил ответа, это было бы ошибкой.

person Rik Heywood    schedule 21.09.2009

http://docs.jquery.com/Ajax/jQuery.ajax#options

Дайте вариант для успеха и ошибки. Эти функции будут вызываться после того, как вызов будет сделан.

person Natrium    schedule 21.09.2009

Есть четыре возможных сценария, которые вы можете получить:

  • сервер отсутствует или отказывается от соединения (это можно определить по библиотеке сокетов, которую использует браузер, которая сообщит об ошибке соединения)
  • соединение работает, и сервер возвращает код ошибки неуспешного завершения - это возвращается в заголовке. Действительно, запрос может быть успешным (код 200) даже с пустым телом, это совершенно верно.
  • соединение устанавливается, но сервер не отвечает - мне не ясны подробности этого, но я ожидаю, что JS в конечном итоге истечет время ожидания, потому что ответ не был получен, и на основе этого вернет ошибку.
  • соединение устанавливается, но сервер отвечает неправильно (например, нет заголовков) - реализация JS должна возвращать это как ошибку.

В любом случае, все сценарии ошибок обрабатываются реализацией XMLHttpRequest ядра Javascript - jQuery просто оборачивает его с немного более аккуратным интерфейсом.

В вашем случае (теперь вы предоставили больше информации) я бы рекомендовал вам использовать Firebug, чтобы увидеть ответ сервера на ваш запрос. Тем не менее, вы не должны получать исключение для чего-либо неуместного с сервера, JS должен вызывать один и тот же обратный вызов ошибки для всех вышеперечисленных случаев.

person ijw    schedule 21.09.2009
comment
Добавлен #4 - неверный формат возврата. Вероятно, вы вызываете неверный HTTP-ответ, но это невозможно сказать, поскольку мы понятия не имеем, какой серверный язык вы используете... - person ijw; 21.09.2009
comment
Сервер ничего не ответил на мой запрос. - person omg; 21.09.2009
comment
Ничего - нет тела? Нет заголовков? Какие? - person ijw; 21.09.2009
comment
Заголовок нормальный. Но никто. Странно, теперь не сообщает. - person omg; 21.09.2009

вам не хватает { } ?

$.ajax(error:..,success:..)

должно быть

$.ajax( { error: function( ){ } } );

если это так, извини, чувак, было бы неприятно тратить на это столько времени, ха-ха

person Dan Beam    schedule 17.12.2009

Я исправил это, указав тайм-аут в моем вызове ajax. Тайм-аут ajax просто сдавался после X времени. Несмотря на то, что страница в конечном итоге вернула данные, объект ajax просто сдался и вылетел, но выдал эту ошибку.

person dubRun    schedule 11.02.2011