Pregunta ¿Cómo manejaría los errores al usar jQuery.ajax ()?


Cuando usas jQueryes método ajax para enviar los datos del formulario, ¿cuál es la mejor forma de manejar los errores? Este es un ejemplo de cómo se vería una llamada:

$.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 puede fallar por una serie de razones, como el nombre de usuario duplicado, la dirección de correo electrónico duplicada, etc., y el ashx está escrito para emitir una excepción cuando esto sucede.

Mi problema parece ser que lanzando una excepción, el ashx causa statusText y errorThrown ser indefinido.

Puedo llegar al XMLHttpRequest.responseText que contiene el HTML que compone la página de error .net estándar.

Estoy buscando el título de la página en el texto de respuesta y usando el título para determinar qué error se produjo. Aunque tengo la sospecha de que esto se derrumbará cuando habilite páginas personalizadas para el manejo de errores.

¿Debo arrojar los errores en el ashx, o debería devolver un código de estado como parte de los datos devueltos por la llamada a userCreation.ashx, y luego usar esto para decidir qué acción tomar?
¿Cómo manejas estas situaciones?


32
2017-08-26 16:26


origen


Respuestas:


¿Debo arrojar los errores en el   ashx, o debería estar devolviendo un   código de estado como parte de los datos   devuelto por la llamada a   userCreation.ashx, luego usar esto para   decidir qué acción tomar? Cómo   manejar estas situaciones?

Personalmente, si es posible, preferiría manejar esto en el lado del servidor y elaborar un mensaje para el usuario allí. Esto funciona muy bien en un escenario donde solo desea mostrar un mensaje al usuario diciéndole lo que sucedió (mensaje de validación, esencialmente).

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


16
2017-08-26 16:29



Para la depuración, generalmente solo creo un elemento (en el caso siguiente: <div id="error"></div>) en la página y escribirle la XmlHttpRequest:

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

Luego puede ver los tipos de errores que están ocurriendo y capturarlos correctamente:

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

En su ashx, ¿puede lanzar una nueva excepción (por ejemplo, "Usuario Inválido", etc.) y luego analizar eso fuera del XMLHttpRequest.responseText? Para mí cuando recibo un error, XMLHttpRequest.responseText no es la página de error Asp.Net estándar, 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"
}

Editar: Esto podría deberse a que la función que estoy llamando está marcada con estos atributos:

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

20
2017-08-26 16:32



Ahora tengo un problema con respecto a qué respuesta aceptar.

Pensar más en el problema me lleva a la conclusión de que estaba lanzando excepciones incorrectamente. Los nombres de usuario duplicados, direcciones de correo electrónico, etc. son problemas esperados durante un proceso de registro y, por lo tanto, no son excepciones, sino simplemente errores. En cuyo caso, probablemente no debería lanzar excepciones, sino devolver códigos de error.

Lo que me lleva a pensar que irobinson El enfoque debe ser el que se debe tomar en este caso, especialmente dado que la forma es solo una pequeña parte de la IU que se muestra. Ahora he implementado esta solución y estoy devolviendo xml que contiene un estado y un mensaje opcional que se mostrará. Entonces puedo usar jQuery para analizarlo y tomar la acción adecuada:

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 ' la respuesta es muy detallada y sería perfecta durante la depuración o si quisiera mostrar un mensaje de excepción al usuario. Definitivamente no estoy recibiendo JSON, por lo que probablemente se deba a uno de esos atributos que travis ha enumerado, ya que no los tengo en mi código.

(Voy a aceptar la respuesta de irobinson, pero voto la respuesta de travis. Me parece extraño aceptar una respuesta que no tiene la mayoría de los votos).


4
2017-08-27 11:24