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;
});
prostock
sumber
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)!
    }
}
UltraInstinct
sumber
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 :

A-312
sumber
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.

ubuntugod
sumber
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
});
vivek java
sumber
-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);
});
Jason Clay
sumber
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