Cara yang tepat untuk menangkap pengecualian dari JSON.parse


260

Saya menggunakan JSON.parserespons yang terkadang berisi respons 404. Dalam kasus di mana ia mengembalikan 404, apakah ada cara untuk menangkap pengecualian dan kemudian menjalankan beberapa kode lainnya?

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 respons terkait dengan XMLHttpRequest, bukan JSON.parsedirinya sendiri. Jika Anda menunjukkan kode sippet kepada saya, saya mungkin dapat membantu Anda.
Ming-Tang

data = JSON.parse (respons, fungsi (kunci, nilai) {tipe var; if (nilai && typeof nilai === 'objek') {type = value.type; if (typeof type === 'string' && typeof window [type] === 'function') {return new (window [type]) (value);}} nilai pengembalian;
prostock

saya memposting sesuatu ke iframe lalu membaca kembali isi iframe dengan json parse ... jadi kadang-kadang itu bukan string json
prostock

Jawaban:


419

saya memposting sesuatu ke iframe lalu membaca kembali isi iframe dengan json parse ... jadi kadang-kadang itu bukan string json

Coba ini:

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

12
Jika blok percobaan berisi lebih banyak pernyataan, Anda dapat mengidentifikasi pengecualian dengan e.name == "SyntaxError", asalkan Anda tidak memiliki eval.
user1158559

1
Bagaimana jika responsnya tidak didefinisikan?
vini

12

Kami dapat memeriksa kesalahan & 404 statusCode, dan menggunakan try {} catch (err) {}.

Anda dapat mencoba ini:

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

Baca lebih lajut :


5

Saya cukup baru di Javascript. Tapi ini yang saya mengerti: JSON.parse()mengembalikan SyntaxErrorpengecualian ketika JSON yang tidak valid diberikan sebagai parameter pertama . Begitu. Akan lebih baik untuk menangkap pengecualian itu seperti seperti berikut:

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

Alasan mengapa saya membuat kata-kata "parameter pertama" menjadi tebal adalah karena JSON.parse()fungsi reviver menjadi parameter kedua.


1
Saya tidak mengerti final Anda jika / selain itu. Jika benar atau salah, kode yang sama berjalan:console.err(objError);
HoldOffHunger

Itu hanya mengembalikan objError, nama sebagai SyntaxError, bukan bagian kesalahan yang sebenarnya.
Toshihiko

2
Satu hal lagi. Itu harus: console.error()tidakconsole.err()
k.vincent

-2

Anda dapat mencoba ini:

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

-5

Janji ini tidak akan menyelesaikan jika argumen JSON.parse () tidak dapat diuraikan menjadi objek JSON.

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

2
Tapi ini tidak menangkap pengecualian yang dilemparkan olehJSON.parse
realappie

Semua Anda perlu mengubah untuk ini akan berlaku adalah mengganti JSON.parse(...) untuk ()=>JSON.parse(...).
John
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.