Maneira correta de capturar exceção do JSON.parse

260

Estou usando JSON.parseuma resposta que às vezes contém uma resposta 404. Nos casos em que retorna 404, existe uma maneira de capturar uma exceção e, em seguida, executar outro código?

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
fonte
3
A resposta 404 está relacionada XMLHttpRequest, não a JSON.parsesi mesma. Se você me mostrar o trecho de código, talvez eu possa ajudá-lo.
Ming-Tang
data = JSON.parse (resposta, função (chave, valor) {var type; if (value && typeof value === 'objeto') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} retorna valor;
prostock
i postar algo em um iframe, em seguida, ler novamente o conteúdo do iframe com parse json ... por isso às vezes não é uma string JSON
ProStock

Respostas:

419

Eu postei algo em um iframe e depois li novamente o conteúdo do iframe com json parse ... então, às vezes, não é uma string json

Tente o seguinte:

if(response) {
    try {
        a = JSON.parse(response);
    } catch(e) {
        alert(e); // error in the above string (in this case, yes)!
    }
}
UltraInstinct
fonte
12
Se o bloco try contiver mais instruções, você poderá identificar a exceção por e.name == "SyntaxError", desde que você não tenha uma avaliação.
user1158559
1
E se a resposta for indefinida?
vini
12

Podemos verificar o erro e o statusCode 404 e usá-lo try {} catch (err) {}.

Você pode tentar isso:

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

Consulte Mais informação :

A-312
fonte
5

Eu sou bastante novo em Javascript. Mas é isso que eu entendi: JSON.parse()retorna SyntaxErrorexceções quando JSON inválido é fornecido como seu primeiro parâmetro . Assim. Seria melhor capturar essa exceção da seguinte forma:

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

A razão pela qual tornei as palavras "primeiro parâmetro" em negrito é que JSON.parse()assume uma função reviver como seu segundo parâmetro.

ubuntugod
fonte
1
Eu não entendo o seu final se / else. Se verdadeiro ou falso, o mesmo código é executado:console.err(objError);
HoldOffHunger
Apenas retorna objError, nomeie como SyntaxError, em vez da parte do erro real.
Toshihiko
2
Mais uma coisa. Ele deve ser: console.error()nãoconsole.err()
k.vincent
-2

Você pode tentar isso:

Promise.resolve(JSON.parse(response)).then(json => {
    response = json ;
}).catch(err => {
    response = response
});
vivek java
fonte
-5

Essa promessa não será resolvida se o argumento JSON.parse () não puder ser analisado em um objeto JSON.

Promise.resolve(JSON.parse('{"key":"value"}')).then(json => {
    console.log(json);
}).catch(err => {
    console.log(err);
});
Jason Clay
fonte
2
Mas isso não capturar a exceção lançada peloJSON.parse
realappie
Tudo que você precisa mudar para que isso seja válido é trocar JSON.parse(...) para ()=>JSON.parse(...).
John