Manipulação de erros HTTP 4nn / 5nn do lado do servidor retornando um documento HTML inteiro em solicitações ajax do jQuery

Ao ponto: como você lidaria com os erros de HTTP 4nn / 5nn do lado do servidor nas solicitações de ajax do jQuery? Este caso refere-se a um aplicativo da Web JSP / Servlet no lado do servidor. Aqui não estou falando de exceções de tempo de execução triviais, comoNullPointerException e assim por diante. Suponha que todos sejam tratados perfeitamente. Um bom exemplo de tal erro HTTP 4nn / 5nn é 401 não autorizado (direitos de usuário insuficientes) e 500 erros de servidor internos (banco de dados inoperante, erro de E / S,Errors, etc). Suponha que eles não possam (ou não devam) ser capturados no nível de codificação.

Agora eu acabei de declarar um<error-page> emweb.xml para esse tipo de erro. Basicamente, ele encaminha a solicitação para uma página de erro JSP / HTML predefinida, na qual o usuário final é informado de que ocorreu um erro grave e que o usuário pode entrar em contato com [email protected] para obter mais assistência. A mesma página também exibe os detalhes globais sobre o erro / exceção.

Ele funciona perfeitamente em solicitações HTTP regulares, mas como você lidaria com isso em solicitações XMLHtttp usando jQuery? Qual é o melhor para a experiência do usuário? Para mim, seria apenas exibir a página de erro inteira como se fosse uma solicitação HTTP normal. Eu resolvi da seguinte forma:

function init() {
    $.ajaxSetup({
        error: handleXhrError
    });
}

function handleXhrError(xhr) {
    document.open();
    document.write(xhr.responseText);
    document.close();
}

Embora funcione perfeitamente, parece-me um hack. Substituindo o documento inteiro pelo conteúdo da página de erro HTTP. Mas é assim que você seguiria? Se não, você pode talvez explicar por que não e de que maneira você prefere? A única alternativa que vejo é usar JS para exibir alguma caixa de alerta / mensagem para informar o usuário sobre o erro não resolvível, mas o usuáriopoderia demiti-lo e continue com a página, enquanto isso não deve ser possível.

questionAnswers(5)

yourAnswerToTheQuestion