Правильний спосіб знайти виняток з JSON.parse


260

Я використовую JSON.parseвідповідь, яка іноді містить відповідь 404. У випадках, коли він повертає 404, чи є спосіб вилучити виняток і виконати якийсь інший код?

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
Відповідь 404 пов'язана XMLHttpRequestне з JSON.parseсамим собою. Якщо ви покажете мені ковток коду, я можу вам допомогти.
Мінг-Тан

data = JSON.parse (відповідь, функція (ключ, значення) {тип типу; якщо (значення && typeof значення === 'об’єкт') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} return value;
prostock

я розміщую щось у iframe, потім читаю назад вміст iframe з json розбору ... тому іноді це не рядок json
prostock

Відповіді:


419

я розміщую щось у iframe, потім читаю назад вміст iframe з json розбору ... тому іноді це не рядок json

Спробуйте це:

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

12
Якщо блок спробу містить більше висловлювань, ви можете ідентифікувати виняток за e.name == "SyntaxError", якщо у вас немає eval.
користувач1158559

1
Що робити, якщо відповідь не визначена?
vini

12

Ми можемо перевірити код помилки та 404 стану та використовувати try {} catch (err) {}.

Ви можете спробувати це:

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

Детальніше:


5

Я досить новачок у Javascript. Але це те, що я зрозумів: JSON.parse()повертає SyntaxErrorвинятки, коли недійсний JSON надається як його перший параметр . Так. Було б краще спіймати цей виняток як такий:

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

Причиною, чому я зробив слова "перший параметр" жирним, є те, що JSON.parse()приймає функцію оживлення як свій другий параметр.


1
Я не розумію вашого фіналу, якщо / ще. Якщо вірно чи невірно, запускається той самий код:console.err(objError);
HoldOffHunger

Він просто повертає objError, ім'я як SyntaxError, замість реальної частини помилки.
Toshihiko

2
Ще одне. Це повинно бути: console.error()неconsole.err()
Повірений

-2

Ви можете спробувати це:

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

-5

Ця обіцянка не вирішиться, якщо аргумент JSON.parse () неможливо проаналізувати на об'єкт JSON.

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

2
Але це не потрапляє на виняток, кинутий наJSON.parse
realappie

Все , що потрібно змінити для цього , щоб бути дійсним є переодягнутися JSON.parse(...) для ()=>JSON.parse(...).
Джон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.