Manejo de errores de jQuery Ajax, muestra mensajes de excepción personalizados
¿Hay alguna manera de mostrar mensajes de excepción personalizados como una alerta en mi mensaje de error de jQuery AJAX?
Por ejemplo, si quiero generar una excepción en el lado del servidor a través de Struts by throw new ApplicationException("User name already exists");
, quiero detectar este mensaje ('el nombre de usuario ya existe') en el mensaje de error de jQuery AJAX.
jQuery("#save").click(function () {
if (jQuery('#form').jVal()) {
jQuery.ajax({
type: "POST",
url: "saveuser.do",
dataType: "html",
data: "userId=" + encodeURIComponent(trim(document.forms[0].userId.value)),
success: function (response) {
jQuery("#usergrid").trigger("reloadGrid");
clear();
alert("Details saved successfully!!!");
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
}
});
En la segunda alerta en la devolución de llamada de error, donde alerto thrownError
, recibo undefined
el xhr.status
código 500
.
No estoy seguro de dónde me estoy equivocando. ¿Qué puedo hacer para solucionar este problema?
Asegúrate de configurar Response.StatusCode
un valor distinto de 200. Escribe el mensaje de excepción usando Response.Write
, luego usa...
xhr.responseText
..en tu javascript.
Controlador:
public class ClientErrorHandler : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
var response = filterContext.RequestContext.HttpContext.Response;
response.Write(filterContext.Exception.Message);
response.ContentType = MediaTypeNames.Text.Plain;
filterContext.ExceptionHandled = true;
}
}
[ClientErrorHandler]
public class SomeController : Controller
{
[HttpPost]
public ActionResult SomeAction()
{
throw new Exception("Error message");
}
}
Ver guión:
$.ajax({
type: "post", url: "/SomeController/SomeAction",
success: function (data, text) {
//...
},
error: function (request, status, error) {
alert(request.responseText);
}
});
Lado del servidor:
doPost(HttpServletRequest request, HttpServletResponse response){
try{ //logic
}catch(ApplicationException exception){
response.setStatus(400);
response.getWriter().write(exception.getMessage());
//just added semicolon to end of line
}
}
Lado del cliente:
jQuery.ajax({// just showing error property
error: function(jqXHR,error, errorThrown) {
if(jqXHR.status&&jqXHR.status==400){
alert(jqXHR.responseText);
}else{
alert("Something went wrong");
}
}
});
Manejo de errores genéricos de Ajax
Si necesito hacer algún manejo de errores genérico para todas las solicitudes de ajax. Configuraré el controlador ajaxError y mostraré el error en un div llamado errorcontainer en la parte superior del contenido html.
$("div#errorcontainer")
.ajaxError(
function(e, x, settings, exception) {
var message;
var statusErrorMap = {
'400' : "Server understood the request, but request content was invalid.",
'401' : "Unauthorized access.",
'403' : "Forbidden resource can't be accessed.",
'500' : "Internal server error.",
'503' : "Service unavailable."
};
if (x.status) {
message =statusErrorMap[x.status];
if(!message){
message="Unknown Error \n.";
}
}else if(exception=='parsererror'){
message="Error.\nParsing JSON Request failed.";
}else if(exception=='timeout'){
message="Request Time out.";
}else if(exception=='abort'){
message="Request was aborted by the server";
}else {
message="Unknown Error \n.";
}
$(this).css("display","inline");
$(this).html(message);
});