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?

31voto

Abhay Maurya Punkte 10423

Wenn jemand hier ist wie 2016 für die Antwort, verwenden Sie .fail() für die Fehlerbehandlung, da .error() ab jQuery 3.0 veraltet ist

$.ajax( "beispiel.php" )
  .done(function() {
    alert( "Erfolg" );
  })
  .fail(function(jqXHR, textStatus, errorThrown) {
    //Fehler hier behandeln
  })

Ich hoffe, es hilft

4 Stimmen

jqXHR.error() ist in jQuery 3.0 veraltet (eigentlich entfernt), aber die Rückrufe error und success zu $.ajax() sind meines Wissens nicht veraltet.

25voto

Cengiz Araz Punkte 609

Dies ist, was ich getan habe und es funktioniert bisher in einer MVC 5-Anwendung.

Der Rückgabetyp des Controllers ist ContentResult.

public ContentResult DoSomething()
{
    if(somethingIsTrue)
    {
        Response.StatusCode = 500 // Alles andere als 2XX HTTP-Statuscodes sollte funktionieren
        Response.Write("Meine Nachricht");
        return new ContentResult();
    }

    // Hier etwas tun //
    string json = "beliebige JSON-Daten hier";

    return new ContentResult{Content = json, ContentType = "application/json"};
}

Und auf der Client-Seite sieht die Ajax-Funktion so aus

$.ajax({
    type: "POST",
    url: URL,
    data: DATA,
    dataType: "json",
    success: function (json) {
        // Etwas mit dem zurückgegebenen JSON-Objekt machen.
    },
    error: function (xhr, status, errorThrown) {
        // Hier kann der Statuscode abgerufen werden wie;
        xhr.status;

        // Die in Controller hinzugefügte Nachricht kann wie folgt abgerufen werden.
        xhr.responseText;
    }
});

18voto

Robert Koritnik Punkte 100480

Eine allgemeine/wiederverwendbare Lösung

Diese Antwort wird für zukünftige Verweise für alle bereitgestellt, die auf dieses Problem stoßen. Die Lösung besteht aus zwei Dingen:

  1. Benutzerdefinierte Ausnahme ModelStateException, die geworfen wird, wenn die Validierung auf dem Server fehlschlägt (Das Modellstatus berichtet über Validierungsfehler, wenn wir Datenannotationen verwenden und stark typisierte Controlleraktionsoptionen verwenden)
  2. Benutzerdefiniertes Controlleraktion-Fehlerfilter HandleModelStateExceptionAttribute, der die benutzerdefinierte Ausnahme abfängt und den HTTP-Fehlerstatus mit Modellstatusfehler im Body zurückgibt

Dies bietet die optimale Infrastruktur für jQuery Ajax-Aufrufe, um ihr volles Potenzial mit success und error Handlern zu nutzen.

Clientseitiger Code

$.ajax({
    type: "POST",
    url: "some/url",
    success: function(data, status, xhr) {
        // Erfolg behandeln
    },
    error: function(xhr, status, error) {
        // Fehler behandeln
    }
});

Serverseitiger Code

[HandleModelStateException]
public ActionResult Create(User user)
{
    if (!this.ModelState.IsValid)
    {
        throw new ModelStateException(this.ModelState);
    }

    // Neuen Benutzer erstellen, weil die Validierung erfolgreich war
}

Das gesamte Problem ist in diesem Blog-Beitrag detailliert beschrieben, wo Sie den gesamten Code finden, um dies in Ihrer Anwendung auszuführen.

17voto

Wara Haii Punkte 192
 Fehlerfunktion (xhr, ajaxOptions, thrownError) {
               alert(xhr.status);
               alert(thrownError);
            }

im Codefehler Ajax-Anforderung zum Erfassen eines Verbindungsfehlers zwischen Client und Server Wenn Sie die Fehlermeldung Ihrer Anwendung im Erfolgsbereich anzeigen möchten

wie

 Erfolg: Funktion (Daten) {
            // Daten sind ein Objekt, das vom Server gesendet wird
            // Eigenschaft von Daten
            // Status Typ boolesch
            // MSG-Typ Zeichenfolge
            // Ergebnis Typ Zeichenfolge
         if (Datenstatus) { // True kein Fehler
               $ ('# api_text'). val (Datenresultat);
         }
         sonst
         {
               $ ('# error_text'). val (Daten.msg);
         }

      }

16voto

crazyDiamond Punkte 922

Ich fand das gut, weil ich die Nachricht, die ich vom Server empfangen habe, analysieren konnte und eine freundliche Nachricht an den Benutzer ohne den Stacktrace anzeigen konnte...

error: function (response) {
      var r = jQuery.parseJSON(response.responseText);
      alert("Nachricht: " + r.Message);
      alert("StackTrace: " + r.StackTrace);
      alert("ExceptionType: " + r.ExceptionType);
}

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