Cách thích hợp để bắt ngoại lệ từ JSON.parse


260

Tôi đang sử dụng JSON.parsetrên một phản hồi đôi khi có phản hồi 404. Trong trường hợp nó trả về 404, có cách nào để bắt ngoại lệ và sau đó thực thi một số mã khác không?

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
Phản hồi 404 có liên quan đến XMLHttpRequest, không phải JSON.parsechính nó. Nếu bạn chỉ cho tôi đoạn mã, tôi có thể giúp bạn.
Ming-Tang

data = JSON.parse (hồi đáp, hàm (khóa, giá trị) {var type; if (value && typeof value === 'object') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} giá trị trả về;
prostock

tôi đăng một cái gì đó vào iframe sau đó đọc lại nội dung của iframe với phân tích json ... vì vậy đôi khi nó không phải là một chuỗi json
prostock

Câu trả lời:


419

tôi đăng một cái gì đó vào iframe sau đó đọc lại nội dung của iframe với phân tích json ... vì vậy đôi khi nó không phải là một chuỗi json

Thử cái này:

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

12
Nếu khối thử chứa nhiều câu lệnh hơn, bạn có thể xác định ngoại lệ bằng e.name == "SyntaxError", miễn là bạn không có eval.
dùng1158559

1
Điều gì xảy ra nếu phản ứng không được xác định?
vini

12

Chúng tôi có thể kiểm tra lỗi & 404 statusCode và sử dụng try {} catch (err) {}.

Bạn có thể thử điều này:

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

Đọc thêm :


5

Tôi còn khá mới với Javascript. Nhưng đây là những gì tôi hiểu: JSON.parse()trả về các SyntaxErrorngoại lệ khi JSON không hợp lệ được cung cấp làm tham số đầu tiên . Vì thế. Sẽ tốt hơn nếu bắt ngoại lệ đó như sau:

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

Lý do tại sao tôi thực hiện các từ "tham số thứ nhất" in đậm là JSON.parse()lấy hàm reviver làm tham số thứ hai.


1
Tôi không hiểu cuối cùng của bạn nếu / khác. Nếu đúng hoặc sai, cùng một mã chạy:console.err(objError);
Hold OfferHunger

Nó chỉ trả về objError, tên là SyntaxError, thay vì phần lỗi thực sự.
Toshihiko

2
Một điều nữa. Nó nên là: console.error()khôngconsole.err()
k.vincent 16/07/19

-2

Bạn có thể thử điều này:

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

-5

Lời hứa này sẽ không giải quyết nếu không thể phân tích cú pháp đối số JSON.parse () thành đối tượng JSON.

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

2
Nhưng điều này không bắt được ngoại lệ được ném bởiJSON.parse
realappie

Tất cả bạn cần thay đổi để điều này là hợp lệ là thay đổi JSON.parse(...) cho ()=>JSON.parse(...).
John
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.