2013-05-01 11 views
15

किसी कारण से यह कोड मुझे एक अपरिचित अपवाद त्रुटि देता है। ऐसा लगता है कि पकड़ ब्लॉक त्रुटि को पकड़ नहीं रहा है। क्या इस तरह से स्कॉप्ड ब्लॉक को पकड़ने की कोशिश की जा रही है कि मैं एक नेस्टेड फ़ंक्शन में कोई त्रुटि नहीं डाल सकता, और उसके बाद चेन को ऊपर उठाए गए कैच स्टेटमेंट द्वारा पकड़ा जा सकता है? जिस अनुप्रयोग में मैं काम कर रहा हूं उसके साथ कुछ संवेदनशील डेटा हटा दिए गए हैं, लेकिन यह उम्मीद की जाती है कि लीडइन्फो [0/1] 32 वर्ण अल्फा न्यूमेरिक स्ट्रिंग होगी जो मैं यूआरएल पैरामीटर से खींचता हूं।कैच स्टेटमेंट फेंक त्रुटि नहीं पकड़ता

अंतर्निहित मुद्दा मेरे AJAX कॉल के साथ एपीआई से एक त्रुटि लौटा रहा है और उस त्रुटि को एप्लिकेशन के भीतर ठीक से संभाला नहीं जा रहा है। इसलिए फेंक कथन की जरूरत है। AJAX कॉल ठीक से पूरा करता है, और एक JSON ऑब्जेक्ट देता है जिसमें एक ईमेल के रूप में ईमेल पता नहीं होता है, इसलिए मुझे इसे इस तरह से संभालने की ज़रूरत है जिससे पेज को प्रतिबिंबित किया जा सके।

jQuery(document).ready(function(){ 
     try { 
      url = "http://api.com/api/v1/lead/" + leadInfo[1] 

      jQuery.ajax({ 
       type: 'GET', 
       contentType: 'application/json', 
       url: url, 
       dataType : 'jsonp', 
       success: function (result) { 

        result = jQuery.parseJSON(result); 

        if(!result.data.email){ 
         throw ('New exception'); 
        } 
        console.log(result); 
        jQuery('.email').html(result.data.email); 
       } 
      }); 


      jQuery('.surveryButton').click(function(){ 
       window.location.replace("http://" + pgInventory.host + pgInventory.path + leadInfo[0] + "&curLeadId=" + leadInfo[1] + "&curViewedPages=0"); 
      }); 
     } 
     catch(err) { 
      jQuery('.email').html('your e-mail address'); 
      jQuery('#arrowContent').remove(); 
     } 
}); 

उत्तर

35

कारण है कि अपने try catch ब्लॉक विफल हो रहा है क्योंकि एक ajax अनुरोध अतुल्यकालिक है। प्रयास पकड़ ब्लॉक अजाक्स कॉल से पहले निष्पादित होगा और अनुरोध स्वयं भेज देगा, लेकिन परिणाम लौटाए जाने पर त्रुटि फेंक दी जाएगी, समय में एक कम समय पर।

जब try catch ब्लॉक निष्पादित किया गया है, तो कोई त्रुटि नहीं है। जब त्रुटि फेंक दी जाती है, तो try catch नहीं है। अगर आपको AJAX अनुरोधों के लिए try catch की आवश्यकता है, तो success कॉलबैक के अंदर हमेशा AJAX try catch ब्लॉक डालें, इसके बाहर कभी भी नहीं।

यहाँ कैसे आप इसे करना चाहिए:

success: function (result) { 
    try { 
     result = jQuery.parseJSON(result); 

     if (!result.data.email) { 
     throw ('New exception'); 
     } 
     console.log(result); 
     jQuery('.email').html(result.data.email); 
    } catch (exception) { 
     console.error("bla"); 
    }; 
} 
+0

ऐसा लग रहा है मुझे जेएसओएनपी की मेरी समझ थोड़ी सी पीछे कॉल करती थी। मैं इस धारणा के तहत था कि जेएसओएनपी कॉल को हमेशा तुल्यकालिक होने के लिए मजबूर होना पड़ता था, इसके विपरीत बिल्कुल विपरीत होता है, उन्हें हमेशा असीमित होने के लिए मजबूर किया जाता है। यह अब पूरी समझ में आता है कि उस छोटी सी जानकारी को हल किया गया है। जल्दी उत्तर देने के लिए धन्यवाद! – Xenology

1

समस्या यह है कि ajax परिभाषा से अतुल्यकालिक है। आपका अपवाद $.ajax फ़ंक्शन के भीतर से नहीं फेंक दिया गया है, लेकिन कॉलबैक सफलता पर फ़ंक्शन (जिसे बाद में ट्रिगर किया गया है) से।

आपको सर्वर प्रतिक्रिया त्रुटियों को संभालने के लिए error: function(data) {} पैरामीटर भी देना चाहिए, और इसके अलावा आपको कॉलबैक फ़ंक्शन के अंदर प्रयास/पकड़ ब्लॉक रखना चाहिए।

यदि आप वास्तव में कॉलबैक के बाहर इसे पकड़ना चाहते हैं, तो आपको अपवाद फेंकने के बजाए फ़ंक्शन को कॉल करने पर विचार करना चाहिए, क्योंकि मुझे नहीं लगता कि यह कैसे किया जा सकता है।

1

जावास्क्रिप्ट में कॉलबैक विधियों की असीमित प्रकृति के कारण, त्रुटि फेंकने वाले फ़ंक्शन का संदर्भ मूल से अलग है। आप इस तरह से करना चाहिए:

success: function (result) { 
    try { 
    result = jQuery.parseJSON(result); 
    if(!result.data.email){ 
     throw ('New exception'); 
    } 
    console.log(result); 
    jQuery('.email').html(result.data.email); 
    } 
    catch(err) { 
    // Dealing with the error 
    } 
} 

मैं, इस उत्कृष्ट article के बारे में (बहुत विशेष) पर एक नजर है करने के लिए आप सुझाव है संदर्भोंबंद और बाइंडिंग javascrit में

संबंधित मुद्दे