809 Stimmen

JQuery Ajax Fehlerbehandlung, benutzerdefinierte Ausnahmemeldungen anzeigen

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

Zum Beispiel, wenn ich eine Ausnahme auf der Serverseite über Struts werfen möchte mit 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);
      }
    });
  }
});

Bei der zweiten Benachrichtigung im Fehler-Callback, wo ich thrownError alarmiere, erhalte ich undefined und der xhr.status Code ist 500.

Ich bin nicht sicher, wo ich falsch liege. Was kann ich tun, um dieses Problem zu beheben?

387voto

Sprintstar Punkte 7700

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

xhr.responseText

..in Ihrem JavaScript.

9 Stimmen

Das ist immer noch der richtige Weg, um dies nach zweieinhalb Jahren zu tun ... :) Ich bin ein wenig weiter gegangen und habe tatsächlich mein eigenes Fehler-JSON-Objekt zurückgegeben, das einzelne oder mehrere Fehler verarbeiten kann, recht gut für die serverseitige Formularvalidierung.

0 Stimmen

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

4 Stimmen

Jetzt bin ich im Jahr 2014. JSON dominierte Ära. Also verwende ich xhr.responseJSON. :D

259voto

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 "richtige" Antwort auf die Frage, aber es zeigt mit Sicherheit eine Lösung auf einem höheren Niveau für das Problem... Schön!

3 Stimmen

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

6 Stimmen

Ich glaube, Sie sollten auch die Zeile response.StatusCode = 500; zur OnException-Methode hinzufügen.

103voto

Serverseite:

     doPost(HttpServletRequest request, HttpServletResponse response){ 
            try{ //Logik
            }catch(ApplicationException exception){ 
               response.setStatus(400);
               response.getWriter().write(exception.getMessage());
               //für das Ende der Zeile wurde nur ein Semikolon hinzugefügt

           }
 }

Clientsseite:

 jQuery.ajax({// zeigt nur den Fehler-Eigenschaft
           error: function(jqXHR,error, errorThrown) {  
               if(jqXHR.status&&jqXHR.status==400){
                    alert(jqXHR.responseText); 
               }else{
                   alert("Etwas ist schief gelaufen");
               }
          }
    }); 

Allgemeine Ajax-Fehlerbehandlung

Wenn ich eine generische Fehlerbehandlung für alle Ajax-Anfragen durchführen muss, werde ich den ajaxError-Handler einstellen und den Fehler in einem div mit dem Namen errorcontainer 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' : "Zugriff nicht autorisiert.",
                '403' : "Verboten, 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.\nAnalyse der JSON-Anforderung fehlgeschlagen.";
            }else if(exception=='timeout'){
                message="Zeitüberschreitung der Anfrage.";
            }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. Mit 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 richtige Antwort, da die Frage nicht nach JSON fragt und der Beispielanforderung explizit nach HTML als Antwort fragt.

0 Stimmen

+1 Richtig. Beachten Sie, dass es üblich ist, ein JSON-codiertes Objekt durch jqXHR.responseText (Zeichenfolge) 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 Anruf bei asp.net gemacht wird, wird dies den Fehlermeldungstitel 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 ('Angefordertes JSON-Parsen fehlgeschlagen.');
    } else if (exception === 'timeout') {
        return ('Zeitüberschreitungsfehler.');
    } else if (exception === 'abort') {
        return ('Ajax-Anforderung abgebrochen.');
    } else {
        return ('Nicht eingefangener 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