从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自己。如果您向我展示代码段,我也许可以为您提供帮助。
Ming-Tang 2010年

data = JSON.parse(response,function(key,value){var type; if(value && typeof value ==='object'){type = value.type; if(typeof type ==='字符串'&& typeof window [type] ==='function'){返回新的(window [type])(值);}}返回值;
prostock 2010年

我将某些内容发布到iframe中,然后使用json解析读取iframe的内容...所以有时它不是json字符串
prostock 2010年

Answers:


419

我将某些内容发布到iframe中,然后使用json解析回读iframe的内容...所以有时它不是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”识别异常,前提是您没有评估。
user1158559

1
如果响应未定义怎么办?
vini

12

我们可以检查错误和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

我对Java相当陌生。但这是我的理解: 当提供无效JSON作为其第一个参数时,JSON.parse()将返回SyntaxError异常。所以。最好像下面这样捕获该异常:

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

它只是返回objError,name作为SyntaxError,而不是真正的错误部分。
俊彦

2
还有一件事。它应该是:console.error()console.err()
k.vincent

-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(...)
约翰·约翰(John
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.