2010-10-15 14 views
16

एक चीज जो मुझे पागल कर रही है वह यह है कि जावास्क्रिप्ट कई अलग-अलग स्थितियों में चुपचाप कैसे विफल रहता है।चुपचाप विफल होने से जावास्क्रिप्ट को रोकने का कोई तरीका?

(उदाहरण के निकाल दिया क्योंकि वह मेरे सवाल की बात confuses)

कई बार मैं एक त्रुटि है कि एक त्रुटि संदेश जब Firebug कंसोल में टाइप दे देंगे भर में आ गए हैं, लेकिन जब यह पेज स्क्रिप्ट में चलता है, यह चुपचाप विफल रहता है, फायरबग कंसोल सक्रिय और खुले के साथ भी!

इनमें से कुछ समस्याएं क्रॉकफोर्ड के जेएसलिंट द्वारा पकड़ी जा सकती हैं, लेकिन अभी भी कई नहीं होंगे।

क्या ब्राउज़र में अधिक त्रुटि संदेश सक्षम करने का कोई तरीका नहीं है?

क्या आप जावास्क्रिप्ट डीबगर वातावरण का उपयोग किए बिना यह सब कुछ कर सकते हैं? मुझे लगता है कि डिबगर्स मुझे ज्यादा मदद नहीं करते हैं। मैं आमतौर पर कुछ console.log() कथन छिड़कता हूं और एक मिनट में समस्या का पता लगा सकता हूं। मुझे नट्स ड्राइव क्या है कि जावास्क्रिप्ट में चुप त्रुटियां लंबे समय तक अनजान हो सकती हैं, या उन तरीकों से दिखाई दे सकती हैं जो बिल्कुल स्पष्ट नहीं हैं। यह और भी निराशाजनक है क्योंकि कंसोल में कथन का परीक्षण करने से कोई त्रुटि मिलती है, तो क्या चल रहा है?

मुझे रास्ते में अपवादों के साथ एक ही समस्या है, क्या किसी ने इसे देखा है? अक्सर मेरे throw new कथन बिल्कुल काम नहीं करते हैं। लेकिन अगर मैं कंसोल में एक ही चीज़ टाइप करता हूं, तो यह करता है।

आपकी सहायक टिप्पणियों के लिए धन्यवाद (पहला उत्तर), लेकिन यह मेरा प्रश्न नहीं है। ये परीक्षण तब उपयोगी होते हैं जब आपको किसी वर्ग को पैरामीटर को स्वच्छ करने की आवश्यकता होती है, उदाहरण के लिए, जब आप पर्यावरण के बारे में निश्चित रूप से नहीं जानते हैं। आप गुणों या कक्षाओं के अस्तित्व के लिए परीक्षण नहीं करना चाहते हैं जहां आप उम्मीद करते हैं कि वे वहां हों; यह किसी भी कारण से कोड फूला जाएगा।

+0

मौन त्रुटि से आपका क्या मतलब है? जब ब्राउज़र में कोई वेब पेज चलता है, तो सभी जावास्क्रिप्ट त्रुटियां डिफ़ॉल्ट रूप से चुप होती हैं, क्योंकि साइट के आगंतुकों को उन्हें दिखाने का कोई मतलब नहीं है। –

+1

मुझे लगता है कि मैं सोच रहा हूं कि याहू और Google पर जावास्क्रिप्ट गुरु क्या कर रहे हैं। उनके पास एक महान कंपाइलर है, और जेस्लिंट है लेकिन यह पर्याप्त नहीं है। मुझे विश्वास नहीं है कि वे इसके साथ आगे बढ़ रहे हैं। मेरा कुछ छूट रहा है। मैं यह पता लगाने की कोशिश कर रहा हूं कि किसी को माइक्रोसॉफ्ट द्वारा प्रदान किए गए डीबग पर्यावरण का उपयोग करना चाहिए, या यदि डेवलपर मोड में ब्राउज़र चलाने के लिए अन्य विधियां हैं और कंसोल में उन सभी त्रुटियों को देखें। और पृष्ठ चलने पर फ़ायरबग चुप क्यों रहता है, लेकिन जब मैं कंसोल में अपमानजनक कोड टाइप करता हूं तो त्रुटियों को दिखाता है (कंसोल हमेशा खुला रहता है)? –

उत्तर

6

मुझे लगता है कि इस प्रश्न के कुछ जवाब प्रश्न को गलत व्याख्या कर रहे हैं। IIUC, सवाल यह कह रहा है कि त्रुटि है जब यह कोड वास्तविक वेबपृष्ठ के अंदर चलाया जाता है, लेकिन ओपी होना चाहता है। (संभवतः डीबगिंग उद्देश्यों के लिए, मुख्य रूप से।)

मेरा प्रश्न तब होगा, यह कोड वास्तव में वेबसाइट के संदर्भ में चल रहा है? संभावना है कि यह आपके सामने आने से पहले त्रुटि को खत्म कर रहा है। उदाहरण के लिए, कुछ पुस्तकालय विशिष्ट कॉलबैक (उदा। एक्सएचआर के लिए) में होने वाली त्रुटियों को सहजता से घुमा सकते हैं। हालांकि, अगर वे अच्छे हैं, तो वे एक त्रुटि होने पर अधिसूचना प्राप्त करने के लिए एक हुक पॉइंट प्रदान करते हैं।

+1

आप सही हैं। अब जब आप इसका जिक्र करते हैं, मुझे लगता है कि मैंने कभी-कभी यूयूआई (यूयूआई 2.8) द्वारा पकड़े गए त्रुटियों को देखा। हो सकता है कि वे पकड़ने वाले ब्लॉक में बहुत सारे कोड चला रहे हों? मैं क्या होता है यह देखने के लिए एक कोशिश पकड़ ब्लॉक में अपना कोड चलाने का परीक्षण करूंगा। –

4

आप वस्तुओं के साथ काम कर रहे हैं जिसके लिए आप अगर वे रनटाइम पर मौजूद सुनिश्चित नहीं हैं या नहीं, आप अपने अस्तित्व के लिए जाँच करने के लिए है:

if (Foo && Foo.Apple) { 
    // exists, do something with it 
} else { 
    // doesn't exist, do Plan B 
} 

ध्यान दें कि अभिव्यक्ति (फू & & Foo.Apple) पहले जांच करेगा कि क्या फू मौजूद है, और केवल अगर ऐसा होता है, तो यह जांच करेगा कि क्या उसके पास ऐप्पल नाम की संपत्ति है या नहीं। यदि यह है, तो if-branch निष्पादित करेगा।

यदि फू मौजूद नहीं है, या यदि इसमें ऐप्पल संपत्ति नहीं है, तो अन्य शाखा निष्पादित होगी। अधिक जानकारी के लिए

var a; 
try { 
    a = new Foo.Apple(); 
} catch (err) { 
    // Error handling 
} 

: पहले https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch

+0

आप सही हैं, लेकिन यह विशेष मुद्दा यह था कि मेरे पास जावास्क्रिप्ट "बंडल" में एक घटक था जो लोड नहीं हुआ था। कोड उस घटक की अपेक्षा नहीं कर रहा है, यह निर्भरता है। मेरा सवाल एक चुप त्रुटि के बजाए नोटिस प्राप्त करने का तरीका खोजने के बारे में अधिक है जो कभी-कभी निराशाजनक होता है। –

+0

ठीक है, यदि आपके पास कई घटक हैं, तो आपको रक्षात्मक रुख लेना होगा और संभावना है कि एक घटक लोड/निष्पादित करने में असफल हो सकता है। बेशक, आप उम्मीद करते हैं कि यह वहां होगा, लेकिन आप सुनिश्चित नहीं हो सकते हैं। यही कारण है कि आप रक्षात्मक रूप से प्रोग्राम करते हैं और हमेशा पहले जांच करते हैं कि क्या विशेष घटक if statement का उपयोग करके मौजूद है। यदि यह अस्तित्व में है, ठीक है, यदि नहीं, तो अन्य-शाखा का उपयोग "नोटिस" के रूप में करें। बेशक, आप घटक को फिर से लोड करने का प्रयास करने के लिए अन्य शाखा का उपयोग कर सकते हैं (उदाहरण के लिए)। ब्लॉक के अंदर एक चर घोषित करने के लिए –

5

कोड के नीचे सभी त्रुटियों catch ब्लॉक में पकड़ेगा बुलियन स्थिति का उपयोग करें और जांचें कि क्या मूल्य मौजूद है या नहीं।

if(Foo.Apple){ 
\\your code 
} 
else 
{ 
//Foo.Apple does not exist, do some exception handling here 
} 
+1

-1। परिवर्तनीय घोषणा विवरण निष्पादन संदर्भ के पहले बयान होना चाहिए। "कार्यक्रम के बीच में" चर घोषित करना एक बुरा अभ्यास है। –

+0

इसके अलावा, मेरा मानना ​​है कि रक्षात्मक अस्तित्व जांच त्रुटियों को मजबूर करने से कहीं बेहतर अभ्यास है। –

+1

आप परिवर्तनीय घोषणा के बारे में सही हैं, टिप्पणी में इसे ठीक किया गया है। अस्तित्व की जांच के बारे में, यदि आपको विशेष रूप से यह जानने की आवश्यकता है कि कौन सी घोषणा विफल हुई है, तो आप सही हैं, लेकिन ऐसे मामलों में जहां इससे कोई फर्क नहीं पड़ता और वहां बहुत सारे चेक हैं, यह मुझे लगता है कि यह बहुत बेहतर है। – matte

3

, @sime Vidas से सहमत हैं तो अपवाद और नियंत्रित किया जा करने के लिए नहीं चुप छोड़ दिया है,

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

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