Проблема в том, что XMLHttpRequest выкидывает только два исключения:
exception XMLHttpRequestException {
unsigned short code;
};
const unsigned short NETWORK_ERR = 101;
const unsigned short ABORT_ERR = 102;
NETWORK_ERR — ошибка сети.
ABORT_ERR — пользователь отменил запрос.
Ещё один немаловажный момент: NETWORK_ERR и ABORT_ERR не выкидываются в асинхронном режиме.
Всё остальное отлавливаться не будет, и нужно писать свой обработчик, который, например, будет реагировать на код ответа 404 от сервера и т.д.
function test(data) {
// taking care of data
}
function handler() {
if(this.readyState == 4 && this.status == 200) {
// so far so good
if(this.responseXML != null && this.responseXML.getElementById('test').firstChild.data)
// success!
test(this.responseXML.getElementById('test').firstChild.data);
else
test(null);
} else if (this.readyState == 4 && this.status != 200) {
// fetched the wrong page or network error...
test(null);
}
}
var client = new XMLHttpRequest();
client.onreadystatechange = handler;
client.open("GET", "test.xml");
client.send();
Здесь
function handler()
— обработчик, а
client.onreadystatechange = handler;
— привязка этого обработчика к экземпляру XMLHttpRequest.
Просто ответ от сервера с кодом «404 Страница не найдена» не считается за NETWORK_ERR, потому что сервер ответил на запрос. А то, с каким он кодом ответил — это уже на другом уровне обрабатывается.