813 Stimmen

JQuery Ajax-Fehlerbehandlung, Anzeige benutzerdefinierter Ausnahmemeldungen

Gibt es eine Möglichkeit, benutzerdefinierte Ausnahmemeldungen als Alert in meiner jQuery AJAX-Fehlermeldung anzuzeigen?

Zum Beispiel, wenn ich auf der Serverseite eine Ausnahme über Struts auslösen möchte durch throw new ApplicationException("Benutzername existiert bereits");, möchte ich diese Meldung ('Benutzername existiert bereits') in der jQuery AJAX-Fehlermeldung abfangen.

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 erfolgreich gespeichert!!!");
      },
      error: function (xhr, ajaxOptions, thrownError) {
        alert(xhr.status);
        alert(thrownError);
      }
    });
  }
});

Beim zweiten Alert im Fehler-Callback, wo ich thrownError alerte, erhalte ich undefined und der xhr.status Code ist 500.

Ich bin mir nicht sicher, wo ich einen Fehler mache. Was kann ich tun, um dieses Problem zu beheben?

389voto

Sprintstar Punkte 7700

Stellen Sie sicher, dass Sie Response.StatusCode auf einen anderen Wert als 200 setzen. Schreiben Sie die Fehlermeldung mit Response.Write und verwenden Sie dann...

xhr.responseText

...in Ihrem JavaScript.

9 Stimmen

Das ist nach zweieinhalb Jahren immer noch der richtige Weg, dies zu tun... :) Ich bin sogar noch einen Schritt weiter gegangen und habe mein eigenes Error-JSON-Objekt zurückgegeben, das einzelne oder mehrere Fehler verarbeiten kann, ziemlich praktisch für die serverseitige Formularvalidierung.

0 Stimmen

@Wilson Es war wie in den anderen hoch bewerteten Antworten hier gezeigt.

4 Stimmen

Ich bin jetzt im Jahr 2014. JSON dominierte Ära. Also benutze ich xhr.responseJSON. :D

263voto

AlexMAS Punkte 2572

Controller:

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("Fehlermeldung");
    }
}

View script:

$.ajax({
    type: "post", url: "/SomeController/SomeAction",
    success: function (data, text) {
        //...
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
});

16 Stimmen

Dies ist keine "korrekte" Antwort auf die Frage, aber es zeigt definitiv eine höhere Lösungsebene für das Problem... Toll!

3 Stimmen

Ich mache etwas Ähnliches. Es funktioniert gut, wenn alles auf dem Entwicklungsrechner erledigt wird. Wenn ich versuche, von einem anderen Rechner im Netzwerk eine Verbindung herzustellen, enthält xhr.responseText die generische Fehlerseiten-HTML und nicht meine benutzerdefinierte Meldung, siehe stackoverflow.com/questions/3882752/…

6 Stimmen

Ich glaube, dass du auch die Zeile response.StatusCode = 500; zur OnException-Methode hinzufügen solltest.

103voto

Serverseite:

 doPost(HttpServletRequest request, HttpServletResponse response){ 
            try{ //Logik
            }catch(ApplicationException exception){ 
               response.setStatus(400);
               response.getWriter().write(exception.getMessage());
               //einfach Semikolon am Ende der Zeile hinzugefügt

           }
 }

Clientsite:

 jQuery.ajax({// nur Eigenschaft für Fehler anzeigen
           error: function(jqXHR,error, errorThrown) {  
               if(jqXHR.status&&jqXHR.status==400){
                    alert(jqXHR.responseText); 
               }else{
                   alert("Etwas ist schiefgelaufen");
               }
          }
    }); 

Allgemeine Ajax-Fehlerbehandlung

Wenn ich eine allgemeine Fehlerbehandlung für alle Ajax-Anfragen durchführen muss, werde ich den ajaxError-Handler einstellen und den Fehler in einem DIV mit dem Namen Fehlercontainer oben im HTML-Inhalt anzeigen.

$("div#errorcontainer")
    .ajaxError(
        function(e, x, settings, exception) {
            var message;
            var statusErrorMap = {
                '400' : "Der Server hat die Anfrage verstanden, aber der Anfrageinhalt war ungültig.",
                '401' : "Unbefugter Zugriff.",
                '403' : "Verbotener Ressource kann nicht zugegriffen werden.",
                '500' : "Interner Serverfehler.",
                '503' : "Dienst nicht verfügbar."
            };
            if (x.status) {
                message =statusErrorMap[x.status];
                                if(!message){
                                      message="Unbekannter Fehler \n.";
                                  }
            }else if(exception=='parsererror'){
                message="Fehler \n.Parsen des JSON-Anforderung fehlgeschlagen.";
            }else if(exception=='timeout'){
                message="Zeitüberschreitung der Anforderung.";
            }else if(exception=='abort'){
                message="Anfrage wurde vom Server abgebrochen";
            }else {
                message="Unbekannter Fehler \n.";
            }
            $(this).css("display","inline");
            $(this).html(message);
                 });

86voto

Sydney Punkte 11386

Sie müssen den responseText in JSON umwandeln. Verwenden von JQuery:

jsonValue = jQuery.parseJSON( jqXHR.responseText );
console.log(jsonValue.Message);

5 Stimmen

+1, weil dies derzeit die EINZIGE RICHTIGE Antwort auf diese Frage ist! Du kannst "jsonValue.Message" aufrufen, um die Ausnahmemeldung zu erhalten.

2 Stimmen

Eigentlich ist dies nicht die korrekte Antwort, da die Frage nicht nach JSON fragt und die Beispielanfrage explizit nach HTML als Antwort fragt.

0 Stimmen

+1 Richtig. Beachten Sie, dass es üblich ist, ein JSON-codiertes Objekt durch den jqXHR.responseText (String) zu senden. Sie können dann das jsonValue-Objekt verwenden, wie Sie es benötigen. Verwenden Sie die Firebug-Konsole, um die Antwort mit console.log(jsonValue) zu überprüfen.

43voto

Sam Jones Punkte 4179

Wenn ein Aufruf an asp.net gemacht wird, wird dies den Fehlermeldungs-Titel zurückgeben:

Ich habe nicht alle formatErrorMessage selbst geschrieben, aber ich finde es sehr nützlich.

function formatErrorMessage(jqXHR, exception) {

    if (jqXHR.status === 0) {
        return ('Nicht verbunden.\nBitte überprüfen Sie Ihre Netzwerkverbindung.');
    } else if (jqXHR.status == 404) {
        return ('Die angeforderte Seite wurde nicht gefunden. [404]');
    } else if (jqXHR.status == 500) {
        return ('Interner Serverfehler [500].');
    } else if (exception === 'parsererror') {
        return ('Die angeforderte JSON-Parse ist fehlgeschlagen.');
    } else if (exception === 'timeout') {
        return ('Zeitüberschreitungsfehler.');
    } else if (exception === 'abort') {
        return ('Ajax-Anfrage abgebrochen.');
    } else {
        return ('Unbehandelter Fehler.\n' + jqXHR.responseText);
    }
}

var jqxhr = $.post(adressehier, function() {
  alert("Erfolg");
})
.done(function() { alert("zweiter Erfolg"); })
.fail(function(xhr, err) { 

    var responseTitle= $(xhr.responseText).filter('title').get(0);
    alert($(responseTitle).text() + "\n" + formatErrorMessage(xhr, err) ); 
})

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X