jQuery Ajax-foutafhandeling, aangepaste uitzonderingsberichten weergeven

Is er een manier waarop ik aangepaste uitzonderingsberichten kan weergeven als waarschuwing in mijn jQuery AJAX-foutbericht?

Als ik bijvoorbeeld een uitzondering op de server wil plaatsen via Strutsdoor throw new ApplicationException("User name already exists");, ik wil dit bericht (‘gebruikersnaam bestaat al’) in het jQuery AJAX-foutbericht opvangen.

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);
      }
    });
  }
});

Bij de tweede waarschuwing, waar ik de gegenereerde fout waarschuw, krijg ik undefineden de statuscode is 500.

Ik weet niet zeker waar ik de fout in ga. Wat kan ik doen om dit probleem op te lossen?


Antwoord 1, autoriteit 100%

Zorg ervoor dat u Response.StatusCodeinstelt op iets anders dan 200. Schrijf uw uitzonderingsbericht met Response.Writeen gebruik dan…

xhr.responseText

..in je javascript.


Antwoord 2, autoriteit 62%

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

Script bekijken:

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

Antwoord 3, autoriteit 26%

ServerSide:

    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
           }
 }

ClientSide:

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

Algemene Ajax-foutafhandeling

Als ik een algemene foutafhandeling moet doen voor alle ajax-verzoeken. Ik zal de ajaxError-handler instellen en de fout weergeven op een div met de naam errorcontainer bovenaan de html-inhoud.

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

Antwoord 4, autoriteit 23%

U moet de responseTextconverteren naar JSON. JQuery gebruiken:

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

Antwoord 5, autoriteit 10%

Als u asp.net aanroept, wordt de titel van het foutbericht weergegeven:

Ik heb formatErrorMessage niet helemaal zelf geschreven, maar ik vind het erg handig.

function formatErrorMessage(jqXHR, exception) {
    if (jqXHR.status === 0) {
        return ('Not connected.\nPlease verify your network connection.');
    } else if (jqXHR.status == 404) {
        return ('The requested page not found. [404]');
    } else if (jqXHR.status == 500) {
        return ('Internal Server Error [500].');
    } else if (exception === 'parsererror') {
        return ('Requested JSON parse failed.');
    } else if (exception === 'timeout') {
        return ('Time out error.');
    } else if (exception === 'abort') {
        return ('Ajax request aborted.');
    } else {
        return ('Uncaught Error.\n' + jqXHR.responseText);
    }
}
var jqxhr = $.post(addresshere, function() {
  alert("success");
})
.done(function() { alert("second success"); })
.fail(function(xhr, err) { 
    var responseTitle= $(xhr.responseText).filter('title').get(0);
    alert($(responseTitle).text() + "\n" + formatErrorMessage(xhr, err) ); 
})

Antwoord 6, autoriteit 6%

Dit is wat ik deed en het werkt tot nu toe in een MVC 5-toepassing.

Het retourtype van de controller is ContentResult.

public ContentResult DoSomething()
{
    if(somethingIsTrue)
    {
        Response.StatusCode = 500 //Anything other than 2XX HTTP status codes should work
        Response.Write("My Message");
        return new ContentResult();
    }
    //Do something in here//
    string json = "whatever json goes here";
    return new ContentResult{Content = json, ContentType = "application/json"};
}

En aan de kant van de klant ziet de ajax-functie er zo uit

$.ajax({
    type: "POST",
    url: URL,
    data: DATA,
    dataType: "json",
    success: function (json) {
        //Do something with the returned json object.
    },
    error: function (xhr, status, errorThrown) {
        //Here the status code can be retrieved like;
        xhr.status;
        //The message added to Response object in Controller can be retrieved as following.
        xhr.responseText;
    }
});

Antwoord 7, autoriteit 5%

Als iemand hier is zoals in 2016 voor het antwoord, gebruik dan .fail()voor foutafhandeling aangezien .error()is verouderd vanaf jQuery 3.0

$.ajax( "example.php" )
  .done(function() {
    alert( "success" );
  })
  .fail(function(jqXHR, textStatus, errorThrown) {
    //handle error here
  })

Ik hoop dat het helpt


Antwoord 8, autoriteit 4%

error:function (xhr, ajaxOptions, thrownError) {
        alert(xhr.status);
        alert(thrownError);
      }

Antwoord 9, autoriteit 4%

Ik vond dit leuk omdat ik het bericht dat ik vanaf de server stuurde, kon ontleden en een vriendelijk bericht aan de gebruiker kon weergeven zonder de stacktrace…

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

Antwoord 10, autoriteit 2%

Dit wordt waarschijnlijk veroorzaakt doordat de JSON-veldnamen geen aanhalingstekens hebben.

Wijzig de JSON-structuur van:

{welcome:"Welcome"}

naar:

{"welcome":"Welcome"}

Antwoord 11, autoriteit 2%

Deze functie genereert in feite unieke willekeurige API-sleutels en als dit niet het geval is, verschijnt er een pop-upvenster met een foutmelding

In weergave:

<div class="form-group required">
    <label class="col-sm-2 control-label" for="input-storename"><?php echo $entry_storename; ?></label>
    <div class="col-sm-6">
        <input type="text" class="apivalue"  id="api_text" readonly name="API" value="<?php echo strtoupper(substr(md5(rand().microtime()), 0, 12)); ?>" class="form-control" />                                                                    
        <button type="button" class="changeKey1" value="Refresh">Re-Generate</button>
    </div>
</div>
<script>
$(document).ready(function(){
    $('.changeKey1').click(function(){
          debugger;
        $.ajax({
                url  :"index.php?route=account/apiaccess/regenerate",
                type :'POST',
                dataType: "json",
                async:false,
                contentType: "application/json; charset=utf-8",
                success: function(data){
                  var result =  data.sync_id.toUpperCase();
                        if(result){
                          $('#api_text').val(result);
                        }
                  debugger;
                  },
                error: function(xhr, ajaxOptions, thrownError) {
                  alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
                }
        });
    });
  });
</script>

Van controller:

public function regenerate(){
    $json = array();
    $api_key = substr(md5(rand(0,100).microtime()), 0, 12);
    $json['sync_id'] = $api_key; 
    $json['message'] = 'Successfully API Generated';
    $this->response->addHeader('Content-Type: application/json');
    $this->response->setOutput(json_encode($json));
}

De optionele callback-parameter specificeert een callback-functie die moet worden uitgevoerd wanneer de load()-methode is voltooid. De callback-functie kan verschillende parameters hebben:

Type: Functie( jqXHR jqXHR, String textStatus, String errorThrown )

Een functie die moet worden aangeroepen als de aanvraag mislukt.
De functie ontvangt drie argumenten: Het jqXHR (in jQuery 1.4.x, XMLHttpRequest) object, een tekenreeks die het type fout beschrijft dat is opgetreden en een optioneel uitzonderingsobject, als er een is opgetreden. Mogelijke waarden voor het tweede argument (naast null) zijn “time-out”, “error”, “abort” en “parsererror”. Wanneer een HTTP-fout optreedt, ontvangt errorThrown het tekstgedeelte van de HTTP-status, zoals ‘Niet gevonden’ of ‘Interne serverfout’. Vanaf jQuery 1.5 kan de foutinstelling een reeks functies accepteren. Elke functie wordt om de beurt aangeroepen. Opmerking: deze handler wordt niet aangeroepen voor cross-domain script en cross-domain JSONP-verzoeken.


Antwoord 12, autoriteit 2%

Je hebt een JSON-object van de gegooide uitzondering, in het xhr-object. Gebruik gewoon

alert(xhr.responseJSON.Message);

Het JSON-object geeft twee andere eigenschappen weer: ‘ExceptionType’ en ‘StackTrace’


Antwoord 13

Ik geloof dat de Ajax-responshandler de HTTP-statuscode gebruikt om te controleren of er een fout is opgetreden.

Dus als je gewoon een Java-uitzondering op je server-side code gooit, maar het HTTP-antwoord heeft geen 500 statuscode jQuery (of in dit geval waarschijnlijk de XMLHttpRequestobject) gaat er gewoon van uit dat alles in orde was.

Ik zeg dit omdat ik een soortgelijk probleem had in ASP.NET, waarbij ik iets als een ArgumentException (“Weet niet wat ik moet doen…”) gooide, maar de fouthandler startte niet.

Vervolgens stelde ik de Response.StatusCodein op 500 of 200, of ik nu een fout had of niet.


Antwoord 14

jQuery.parseJSON is handig voor succes en fouten.

$.ajax({
    url: "controller/action",
    type: 'POST',
    success: function (data, textStatus, jqXHR) {
        var obj = jQuery.parseJSON(jqXHR.responseText);
        notify(data.toString());
        notify(textStatus.toString());
    },
    error: function (data, textStatus, jqXHR) { notify(textStatus); }
});

Antwoord 15

$("#save").click(function(){
    $("#save").ajaxError(function(event,xhr,settings,error){
        $(this).html{'error: ' (xhr ?xhr.status : '')+ ' ' + (error ? error:'unknown') + 'page: '+settings.url);
    });
});

Antwoord 16

Gooi een nieuwe uitzondering op de server met:

Reactie.StatusCode = 500

Response.StatusDescription = ex.Message()

Ik geloof dat de StatusDescription wordt teruggestuurd naar de Ajax-oproep…

Voorbeeld:

       Try
            Dim file As String = Request.QueryString("file")
            If String.IsNullOrEmpty(file) Then Throw New Exception("File does not exist")
            Dim sTmpFolder As String = "Temp\" & Session.SessionID.ToString()
            sTmpFolder = IO.Path.Combine(Request.PhysicalApplicationPath(), sTmpFolder)
            file = IO.Path.Combine(sTmpFolder, file)
            If IO.File.Exists(file) Then
                IO.File.Delete(file)
            End If
        Catch ex As Exception
            Response.StatusCode = 500
            Response.StatusDescription = ex.Message()
        End Try

Antwoord 17

Hoewel het vele jaren geleden is dat deze vraag werd gesteld, vind ik xhr.responseTextnog steeds niet als het antwoord dat ik zocht. Het gaf me een string in het volgende formaat:

"{"error":true,"message":"The user name or password is incorrect"}"

die ik absoluut niet aan de gebruikers wil laten zien. Waar ik naar op zoek was, is zoiets als hieronder:

alert(xhr.responseJSON.Message);

xhr.responseJSON.messagegeeft me het exacte bericht van het Json-object dat aan de gebruikers kan worden getoond.


Antwoord 18

$("#fmlogin").submit(function(){
   $("#fmlogin").ajaxError(function(event,xhr,settings,error){
       $("#loading").fadeOut('fast');       
       $("#showdata").fadeIn('slow');   
       $("#showdata").html('Error please, try again later or reload the Page. Reason: ' + xhr.status);
       setTimeout(function() {$("#showdata").fadeOut({"opacity":"0"})} , 5500 + 1000); // delays 1 sec after the previous one
    });
});

Als er een formulier is, moet het worden ingediend met valideren

gebruik gewoon de rest van de code

$("#fmlogin").validate({...

...
...
});


Antwoord 19

Eerst moeten we <serviceDebug includeExceptionDetailInFaults=”True” /> instellen in web.config:

<serviceBehaviors> 
 <behavior name=""> 
  <serviceMetadata httpGetEnabled="true" /> 
    **<serviceDebug includeExceptionDetailInFaults="true" />** 
 </behavior> 
</serviceBehaviors>

Naast dat op jQuery-niveau in het foutgedeelte, moet u een foutreactie ontleden die een uitzondering bevat zoals:

.error(function (response, q, t) { 
  var r = jQuery.parseJSON(response.responseText); 
}); 

Dan kunt u met r.Message daadwerkelijk uitzonderingstekst weergeven.

Controleer de volledige code: http:// www.codegateway.com/2012/04/jquery-ajax-handle-exception-thrown-by.html


Antwoord 20

In mijn geval heb ik zojuist HTTP VERB van de controller verwijderd.

   **//[HttpPost]**   ---- just removed this verb
    public JsonResult CascadeDpGetProduct(long categoryId)
    {
        List<ProductModel> list = new List<ProductModel>();
        list = dp.DpProductBasedOnCategoryandQty(categoryId);
        return Json(new SelectList(list, "Value", "Text", JsonRequestBehavior.AllowGet));
    }

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes