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स्वयं से। यदि आप मुझे कोड सिपेट दिखाते हैं, तो मैं आपकी मदद करने में सक्षम हो सकता हूं।
मिंग-तांग

data = JSON.parse (प्रतिक्रिया, फ़ंक्शन (कुंजी, मान) {var प्रकार; यदि (मान और& टाइपोफ़ मूल्य === 'ऑब्जेक्ट') {टाइप = value.type; यदि (टाइपो टाइप === 'स्ट्रिंग' && टाइपोफ़) विंडो [टाइप] === 'फंक्शन') {रिटर्न न्यू (विंडो (टाइप])) (वैल्यू);}} रिटर्न वैल्यू;
प्रोस्टॉक डिक

मैं एक iframe में कुछ पोस्ट करता हूं, तो json parse के साथ iframe की सामग्री को वापस पढ़ता हूं ... तो कभी-कभी यह json string नहीं होती है
prostock

जवाबों:


419

मैं एक iframe में कुछ पोस्ट करता हूं, तो json parse के साथ iframe की सामग्री को वापस पढ़ता हूं ... तो कभी-कभी यह json स्ट्रिंग नहीं होती है

इसे इस्तेमाल करे:

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

12
यदि प्रयास ब्लॉक में अधिक कथन हैं, तो आप e.name == "सिंटैक्सएयर" द्वारा अपवाद की पहचान कर सकते हैं, बशर्ते आपके पास कोई ईवैल न हो।
user1158559

1
क्या होगा अगर प्रतिक्रिया अपरिभाषित है?
vini

12

हम त्रुटि और 404 स्थिति की जाँच कर सकते हैं, और उपयोग कर सकते हैं 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

मैं जावास्क्रिप्ट के लिए काफी नया हूं। : लेकिन यह मैं क्या समझ में आ रहा है JSON.parse()रिटर्न SyntaxErrorअपवाद अमान्य JSON इसकी के रूप में प्रदान की जाती है पहले पैरामीटर । इसलिए। उस अपवाद को इस तरह से पकड़ना बेहतर होगा:

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);
होल्डऑफ ह्यूंगर

यह असली त्रुटि वाले हिस्से के बजाय सिंजैक्स, सिंटैक्सएयर के रूप में नाम देता है।
तोशीहिको

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(...)
जॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.