Der richtige Weg, um eine Ausnahme von JSON.parse abzufangen


260

Ich verwende JSON.parseeine Antwort, die manchmal eine 404-Antwort enthält. Gibt es in den Fällen, in denen 404 zurückgegeben wird, eine Möglichkeit, eine Ausnahme abzufangen und dann einen anderen Code auszuführen?

data = JSON.parse(response, function (key, value) {
    var type;
    if (value && typeof value === 'object') {
        type = value.type;
        if (typeof type === 'string' && typeof window[type] === 'function') {
            return new(window[type])(value);
        }
    }
    return value;
});

3
Die Antwort bezieht sich XMLHttpRequestnicht auf sich JSON.parseselbst. Wenn Sie mir das Code-Sippet zeigen, kann ich Ihnen möglicherweise helfen.
Ming-Tang

data = JSON.parse (Antwort, Funktion (Schlüssel, Wert) {var type; if (Wert && typeof value === 'object') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} return value;
prostock

Ich poste etwas in einem Iframe und lese dann den Inhalt des Iframes mit
JSON-Analyse zurück.

Antworten:


419

Ich poste etwas in einen Iframe und lese dann den Inhalt des Iframes mit JSON-Analyse zurück. Manchmal ist es also kein JSON-String

Versuche dies:

if(response) {
    try {
        a = JSON.parse(response);
    } catch(e) {
        alert(e); // error in the above string (in this case, yes)!
    }
}

12
Wenn der try-Block mehr Anweisungen enthält, können Sie die Ausnahme anhand von e.name == "SyntaxError" identifizieren, sofern Sie keine Auswertung haben.
user1158559

1
Was ist, wenn die Antwort undefiniert ist?
Vini

12

Wir können den Fehler & 404 statusCode überprüfen und verwenden try {} catch (err) {}.

Sie können dies versuchen:

const req = new XMLHttpRequest();
req.onreadystatechange = function() {
    if (req.status == 404) {
        console.log("404");
        return false;
    }

    if (!(req.readyState == 4 && req.status == 200))
        return false;

    const json = (function(raw) {
        try {
            return JSON.parse(raw);
        } catch (err) {
            return false;
        }
    })(req.responseText);

    if (!json)
        return false;

    document.body.innerHTML = "Your city : " + json.city + "<br>Your isp : " + json.org;
};
req.open("GET", "https://ipapi.co/json/", true);
req.send();

Weiterlesen :


5

Ich bin ziemlich neu in Javascript. Aber das habe ich verstanden: JSON.parse()Gibt SyntaxErrorAusnahmen zurück, wenn ungültiger JSON als erster Parameter angegeben wird . So. Es wäre besser, diese Ausnahme wie folgt zu fangen:

try {
    let sData = `
        {
            "id": "1",
            "name": "UbuntuGod",
        }
    `;
    console.log(JSON.parse(sData));
} catch (objError) {
    if (objError instanceof SyntaxError) {
        console.error(objError.name);
    } else {
        console.error(objError.message);
    }
}

Der Grund, warum ich die Wörter "erster Parameter" fett geschrieben habe, ist, dass JSON.parse()eine Reviver-Funktion als zweiter Parameter verwendet wird.


1
Ich verstehe dein Finale nicht, wenn / sonst. Wenn wahr oder falsch, läuft der gleiche Code:console.err(objError);
HoldOffHunger

Es wird nur objError mit dem Namen SyntaxError anstelle des eigentlichen Fehlerteils zurückgegeben.
Toshihiko

2
Eins noch. Es sollte sein: console.error()nichtconsole.err()
k.vincent

-2

Sie können dies versuchen:

Promise.resolve(JSON.parse(response)).then(json => {
    response = json ;
}).catch(err => {
    response = response
});

-5

Dieses Versprechen wird nicht aufgelöst, wenn das Argument von JSON.parse () nicht in ein JSON-Objekt analysiert werden kann.

Promise.resolve(JSON.parse('{"key":"value"}')).then(json => {
    console.log(json);
}).catch(err => {
    console.log(err);
});

2
Aber dies fängt nicht die Ausnahme ein, die von derJSON.parse
realappie

Alles, was Sie ändern müssen, damit dies gültig ist, ist das Auswechseln JSON.parse(...) für ()=>JSON.parse(...).
John
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.