Pregunta

Cuando usas jQuery's método ajax Para enviar datos de formulario, ¿cuál es la mejor manera de manejar los errores?Este es un ejemplo de cómo podría verse 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 varios motivos, como nombre de usuario duplicado, dirección de correo electrónico duplicada, etc., y el ashx está escrito para generar una excepción cuando esto sucede.

Mi problema parece ser que al lanzar una excepción, ashx provoca el statusText y errorThrown ser indefinido.

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

Encuentro el título de la página en el texto de respuesta y lo uso para determinar qué error se produjo.Aunque tengo la sospecha de que esto se desmoronará cuando habilite las páginas personalizadas de manejo de errores.

¿Debería arrojar los errores en 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?

¿Fue útil?

Solución

¿Debería lanzar 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, luego usar esto para decidir qué acción tomar?¿Cómo manejas estas situaciones?

Personalmente, si es posible, preferiría manejar esto en el lado del servidor y enviar un mensaje al usuario allí.Esto funciona muy bien en un escenario en el que 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 algo de javascript para realizar varias acciones basadas en ese código de estado.

Otros consejos

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

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

Luego podrás ver los tipos de errores que se están produciendo 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 generar una nueva excepción (por ejemplo, "Usuario no válido", etc.) y luego simplemente analizarla fuera del XMLHttpRequest.responseText?Para mí, cuando recibo un error, XMLHttpRequest.responseText no es la página de error estándar de Asp.Net, es un objeto JSON que contiene un 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()> _

Ahora tengo el problema de 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 el 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 adoptar en este caso, especialmente porque el formulario es solo una pequeña parte de la interfaz de usuario que se muestra.Ahora he implementado esta solución y estoy devolviendo un xml que contiene un estado y un mensaje opcional que se mostrará.Luego 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 recibo 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 votaré a favor de la respuesta de Travis.Simplemente se siente extraño aceptar una respuesta que no tiene la mayor cantidad de votos).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top