Правильный способ отловить исключение из 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 (ответ, функция (ключ, значение) {тип переменной; if (значение && typeof value === 'object') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} возвращаемое значение;
prostock

я публикую что-то в iframe, затем читаю содержимое iframe с помощью json parse ... так что иногда это не строка json
prostock

Ответы:


419

я публикую что-то в iframe, затем читаю содержимое iframe с помощью json parse ... так что иногда это не строка json

Попробуй это:

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

12
Если блок try содержит больше операторов, вы можете идентифицировать исключение по e.name == "SyntaxError", если у вас нет eval.
user1158559

1
Что если ответ не определен?
вини

12

Мы можем проверить error & 404 statusCode и использовать 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
Я не понимаю ваш финал если / еще. Если true или false, выполняется тот же код: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.