Właściwy sposób na złapanie wyjątku od JSON.parse

260

Korzystam JSON.parsez odpowiedzi, która czasami zawiera odpowiedź 404. Czy w przypadku, gdy zwraca 404, istnieje sposób na złapanie wyjątku, a następnie wykonanie innego kodu?

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;
});
prostock
źródło
3
Odpowiedź 404 jest związana XMLHttpRequest, a nie JSON.parsesama w sobie. Jeśli pokażesz mi fragment kodu, być może będę w stanie ci pomóc.
Ming-Tang,
data = JSON.parse (odpowiedź, funkcja (klucz, wartość) {var type; if (value && typeof value === 'object') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} return return;
prostock
umieszczam coś w ramce iframe, a następnie czytam zawartość
ramki

Odpowiedzi:

419

umieszczam coś w ramce iframe, a następnie czytam zawartość iframe za pomocą parsowania json ... więc czasami nie jest to ciąg json

Spróbuj tego:

if(response) {
    try {
        a = JSON.parse(response);
    } catch(e) {
        alert(e); // error in the above string (in this case, yes)!
    }
}
UltraInstinct
źródło
12
Jeśli blok try zawiera więcej instrukcji, możesz zidentyfikować wyjątek za pomocą e.name == "SyntaxError", pod warunkiem, że nie masz wartości eval.
user1158559,
1
Co jeśli odpowiedź jest niezdefiniowana?
vini
12

Możemy sprawdzić błąd i kod stanu 404 i użyć try {} catch (err) {}.

Możesz spróbować:

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

Czytaj więcej :

A-312
źródło
5

Jestem dość nowy w Javascript. Ale właśnie to zrozumiałem: JSON.parse()zwraca SyntaxErrorwyjątki, gdy jako pierwszy parametr podano niepoprawny JSON . Więc. Lepiej byłoby złapać ten wyjątek jako taki w następujący sposób:

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

Powodem, dla którego pogrubiłem słowa „pierwszy parametr”, jest to, że JSON.parse()jako drugi parametr przyjmuje funkcję Reviver.

ubuntugod
źródło
1
Nie rozumiem twojego ostatecznego, jeśli / jeszcze. Jeśli jest to prawda lub fałsz, uruchamia się ten sam kod:console.err(objError);
HoldOffHunger
Zwraca po prostu obiekt objError o nazwie SyntaxError zamiast części o prawdziwym błędzie.
Toshihiko
2
Jeszcze jedno. Powinno być: console.error()nieconsole.err()
k. Vincent
-2

Możesz spróbować:

Promise.resolve(JSON.parse(response)).then(json => {
    response = json ;
}).catch(err => {
    response = response
});
vivek java
źródło
-5

Ta obietnica nie zostanie rozwiązana, jeśli argument JSON.parse () nie będzie mógł zostać przeanalizowany w obiekcie JSON.

Promise.resolve(JSON.parse('{"key":"value"}')).then(json => {
    console.log(json);
}).catch(err => {
    console.log(err);
});
Jason Clay
źródło
2
Ale to nie JSON.parse
wychwytuje wyjątku zgłoszonego
Wszystko, co musisz zmienić, aby było ważne, to zmiana JSON.parse(...) na ()=>JSON.parse(...).
John