Vra

By die gebruik van jQuery se Ajax metode te vorm data in te dien, wat is die beste manier om foute te hanteer? Dit is 'n voorbeeld van hoe 'n oproep kan lyk:

$.ajax({
    url: "userCreation.ashx",
    data: { u:userName, p:password, e:email },
    type: "POST",
    beforeSend: function(){disableSubmitButton();},
    complete: function(){enableSubmitButton();},
    error: function(xhr, statusText, errorThrown){
            // Work out what the error was and display the appropriate message
        },
    success: function(data){
            displayUserCreatedMessage();
            refreshUserList();
        }
});

Die versoek kan misluk vir 'n aantal redes, soos dubbele gebruiker naam, dupliseer e-pos adres, ens, en die ashx is geskryf om 'n uitsondering te gooi wanneer dit gebeur.

My probleem blyk te wees dat deur die gooi van 'n uitsondering die ashx veroorsaak dat die statusText en errorThrown te wees undefined .

Ek kan kry om die XMLHttpRequest.responseText wat die HTML wat maak die standaard NET fout bladsy bevat.

Ek vind die bladsytitel in die responseText en die gebruik van die titel om uit te werk wat fout is gegooi. Alhoewel ek het 'n vermoede dat hierdie uitmekaar sal val wanneer ek persoonlike hantering fout bladsye skakel.

As ek gooi die foute in die ashx, of moet ek terugkeer 'n status kode as deel van die teruggekeer deur die oproep om userCreation.ashx, hierdie dan met behulp van om te besluit watter stappe te neem data?
Hoe kan jy hierdie situasies te hanteer?

Was dit nuttig?

Oplossing

  

As ek gooi die foute in die   ashx, of moet ek terugkeer 'n   status kode as deel van die data   teruggekeer deur die oproep om   userCreation.ashx, dan is dit die gebruik om   besluit watter stappe te neem? Hoe doen jy   hanteer hierdie situasies?

Persoonlik, as dit moontlik was, sou ek verkies om dit te hanteer op die bediener kant en werk op 'n boodskap aan die gebruiker daar. Dit werk baie goed in 'n scenario waar jy net wil 'n boodskap vertoon aan die gebruiker vir hulle vertel wat gebeur het (validering boodskap, in wese).

As jy egter wil 'n aksie op grond van wat gebeur het op die bediener uit te voer, wil jy dalk 'n status kode gebruik en skryf 'n paar JavaScript om verskeie aksies uit te voer wat gebaseer is op wat status kode.

Ander wenke

Vir ontfouting, het ek gewoonlik net 'n element (in die geval hieronder: <div id="error"></div>) op die bladsy en skryf die XMLHttpRequest om dit:

error: function (XMLHttpRequest, textStatus, errorThrown) {
    $("#error").html(XMLHttpRequest.status + "\n<hr />" + XMLHttpRequest.responseText);
}

Dan kan jy die tipes foute wat voorkom te sien en vang dit korrek:

if (XMLHttpRequest.status === 404) // display some page not found error
if (XMLHttpRequest.status === 500) // display some server error

In jou ashx, kan jy gooi 'n nuwe uitsondering (bv "Ongeldige gebruiker" ens) en dan net ontleed wat uit die XMLHttpRequest.responseText? Vir my as ek 'n fout die XMLHttpRequest.responseText is nie die standaard Asp.Net fout bladsy te kry, dit is 'n into voorwerp wat die fout soos hierdie:

{
"Message":"Index was out of range. Must be non-negative and less than the size of the collection.\r\n
Parameter name: index",
"StackTrace":" at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)\r\n 
at etc...",
"ExceptionType":"System.ArgumentOutOfRangeException"
}

Edit: Dit kan wees omdat die funksie ek vra is gemerk met hierdie eienskappe:

<WebMethod()> _
<ScriptMethod()> _

Nou het ek 'n probleem as waaraan beantwoord om te aanvaar.

Verdere gedagte op die probleem bring my tot die gevolgtrekking gekom dat ek verkeerd uitsonderings is gooi. Dubbele gebruikers name, e-posadresse, ens verwag kwessies tydens 'n aanmelding proses en is dus nie uitsonderings nie, maar bloot foute. In welke geval waarskynlik ek moet nie gooi uitsonderings, maar terugkeer fout kodes.

Watter my lei om te dink benadering wat irobinson se moet die een te neem in hierdie geval wees, veral omdat die vorm is slegs 'n klein deel van die UI vertoon. Ek het nou hierdie oplossing geïmplementeer en ek terugkeer xml met 'n status en 'n opsionele boodskap wat vertoon moet word. Ek kan dan gebruik jQuery om dit te ontleed en daarvolgens op te tree: -

success: function(data){
    var created = $("result", data).attr("success");
    if (created == "OK"){
        resetNewUserForm();
        listUsers('');
    } else {
        var errorMessage = $("result", data).attr("message");
        $("#newUserErrorMessage").text(errorMessage).show();
    }
    enableNewUserForm();
}

Maar Travis ' antwoord is baie gedetailleerde en sal perfek wees tydens ontfouting of as ek wou 'n uitsondering boodskap te vertoon die gebruiker. Ek is beslis nie die ontvangs van into terug, so dit is waarskynlik neer op een van daardie eienskappe wat Travis het gelys, as ek dit nie in my kode.

(Ek gaan antwoord irobinson se aanvaar, maar antwoord Stem op Travis. Dit voel net vreemd 'n antwoord wat nie die meeste stemme word aanvaar.)

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top