从JSON.parse捕获异常的正确方法

pro*_*ock 240 javascript xmlhttprequest

我正在使用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;
});
Run Code Online (Sandbox Code Playgroud)

Ult*_*nct 388

我将一些东西发布到iframe然后用json解析回读iframe的内容...所以有时候它不是一个json字符串

试试这个:

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

  • 如果try块包含更多语句,则可以通过e.name =="SyntaxError"识别异常,前提是您没有eval. (12认同)
  • @vini那么你应该在 if 语句中添加一个 else 语句。 (3认同)
  • 如果响应未定义怎么办? (2认同)

ubu*_*god 10

我对 Javascript 还很陌生。但这就是我的理解: 当提供无效 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我将“第一个参数”这个词加粗的原因是它JSON.parse()以一个reviver函数作为它的第二个参数。

  • 我不明白你最后的 if/else。如果 true 或 false,则运行相同的代码:`console.err(objError);` (2认同)
  • 还有一件事。它应该是:`console.error()`而不是`console.err()` (2认同)

A-3*_*312 7

我们可以检查错误和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();
Run Code Online (Sandbox Code Playgroud)

阅读更多 :


Kar*_*lik 5

如果您正在为此寻找通用函数,请尝试一下。

const parseJSON = (inputString, fallback) => {
  if (inputString) {
    try {
      return JSON.parse(inputString);
    } catch (e) {
      return fallback;
    }
  }
};
Run Code Online (Sandbox Code Playgroud)