18 votos

¿Cómo controlar los errores al usar jQuery.ajax()?

Cuando se utiliza jQuery's ajax método para enviar los datos del formulario, ¿cuál es la mejor manera de manejar los errores? Este es un ejemplo de lo que una llamada puede verse como:

$.ajax({
    url: "userCreation.ashx",
    data: { u:userName, p:password, e:email },
    type: "POST",
    beforeSend: function(){disableSubmitButton();},
    complete: function(){enableSubmitButton();},
    error: function(xhr, statusText, errorThrown){
            // Work out what the error was and display the appropriate message
        },
    success: function(data){
            displayUserCreatedMessage();
            refreshUserList();
        }
});

La solicitud podría fallar por un número de razones, tales como la duplicación de nombre de usuario, dirección de correo electrónico duplicados, etc, y la ashx está escrito para lanzar una excepción cuando esto sucede.

Mi problema parece ser que por el lanzamiento de una excepción a la ashx hace que el statusText y errorThrown a ser indefinido. Puedo llegar a la XMLHttpRequest.responseText que contiene el código HTML que hace la norma .net página de error.

Estoy buscando el título de la página en el responseText y usar el título de descubrir cuál es el error. Aunque tengo la sospecha de que este va a caer a pedazos cuando me permiten la manipulación de las páginas de error personalizadas.

Debo estar tirando de los errores en la ashx, o debería devolver un código de estado como parte de los datos devuelto por la llamada a userCreation.ashx, entonces el uso de este para decidir la acción a tomar? ¿Cómo manejar estas situaciones?

15voto

travis Puntos 14676

Para la depuración, por lo general basta con crear un elemento (en el caso siguiente: <div id="error"></div>) en la página y escribir el XmlHttpRequest:

error: function (XMLHttpRequest, textStatus, errorThrown) {
    $("#error").html(XMLHttpRequest.status + "\n<hr />" + XMLHttpRequest.responseText);
}

A continuación, puede ver los tipos de errores que se producen y la captura de ellos correctamente:

if (XMLHttpRequest.status === 404) // display some page not found error
if (XMLHttpRequest.status === 500) // display some server error

En su ashx, se puede lanzar una nueva excepción (e.g "de Usuario no Válido", etc.) y luego sólo tienes que analizar que de la XMLHttpRequest.responseText? Para mí, cuando me sale un error que el XMLHttpRequest.responseText no es la norma Asp.Net página de error, es un objeto JSON que contiene el error como este:

{
"Message":"Index was out of range. Must be non-negative and less than the size of the collection.\r\n
Parameter name: index",
"StackTrace":" at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)\r\n 
at etc...",
"ExceptionType":"System.ArgumentOutOfRangeException"
}

Edit: Esto podría ser debido a que la función estoy llamando está marcada con estos atributos:

<WebMethod()> _
<ScriptMethod()> _

8voto

Ian Robinson Puntos 8666

Debo estar tirando de los errores en la ashx, o debo estar volviendo un código de estado como parte de los datos devuelto por la llamada a userCreation.ashx, a continuación, utilizar esto para decidir la acción a tomar? ¿Cómo manejar estas situaciones?

Personalmente, si es posible, preferiría manejar esta en el lado del servidor y el trabajo de un mensaje para el usuario. Esto funciona muy bien en un escenario en el que sólo desea mostrar al usuario un mensaje para decirles lo que pasó (mensaje de validación, esencialmente).

Sin embargo, si desea realizar una acción basada en lo que ocurrió en el servidor, puede que desee utilizar un código de estado y escribir javascript para realizar diversas acciones basadas en que el código de estado.

2voto

Brian Knoblauch Puntos 1403

Ahora tengo un problema en cuanto a que la respuesta a aceptar.

Una reflexión más profunda sobre el problema me lleva a la conclusión de que yo estaba incorrectamente lanzar excepciones. Duplicar nombres de usuario, direcciones de correo electrónico, etc se espera que los problemas que surjan durante el proceso de registro y por lo tanto no son excepciones, sino simplemente errores. En el que caso de que yo probablemente no debería estar lanzando excepciones, pero el regreso de los códigos de error.

Lo que me lleva a pensar que irobinson el enfoque debe ser el único a tomar en este caso, sobre todo porque la forma es sólo una pequeña parte de la interfaz de usuario que se muestra. Ahora he implementado esta solución y me voy a volver xml que contiene un estado y un mensaje opcional que se muestra. Puedo utilizar jQuery para analizarlo y tomar la acción apropiada: -

success: function(data){
    var created = $("result", data).attr("success");
    if (created == "OK"){
        resetNewUserForm();
        listUsers('');
    } else {
        var errorMessage = $("result", data).attr("message");
        $("#newUserErrorMessage").text(errorMessage).show();
    }
    enableNewUserForm();
}

Sin embargo travis respuesta es muy detallada y sería perfecto durante la depuración o si quería mostrar un mensaje de excepción para el usuario. Estoy definitivamente no recibir JSON de la espalda, por lo que es probablemente uno de los atributos que travis tiene en la lista, como no los tengo en mi código.

(Voy a aceptar irobinson la respuesta, pero upvote de travis respuesta. Se siente extraño a aceptar una respuesta que no tiene la mayoría de votos.)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: