2010-04-06 18 views
10

ठीक है। मैं यहां बाल बांट रहा हूं, लेकिन मेरा कोड सुसंगत नहीं है और मैं इसे बनाना चाहता हूं। लेकिन इससे पहले कि मैं यह सुनिश्चित करना चाहता हूं कि मैं सही तरीके से जा रहा हूं। व्यवहार में यह कोई प्रभाव नहीं पड़ेगा, लेकिन यह कुछ समय के लिए मुझे परेशान कर दिया गया है तो मैं सोचा मैं अपने साथियों से पूछना चाहता हूँ ...जावास्क्रिप्ट कोशिश/पकड़ें: त्रुटियां या अपवाद?

हर बार जब मैं एक try... catch कथन का उपयोग, कैच ब्लॉक में मैं हमेशा संदेश लॉग इन करें मेरे आंतरिक कंसोल के लिए। हालांकि मेरे लॉग संदेश सुसंगत नहीं हैं। कोड कार्यों ठीक से किसी भी तरह से

catch(ex) { 
DFTools.console.log("someMethod caught an exception: ",ex.message); 
... 

जाहिर है, लेकिन यह मुझे परेशान करने के लिए है कि मैं कभी-कभी "त्रुटि" और कभी कभी करने के लिए "अपवाद" का उल्लेख शुरू कर रहा है:

catch(err) { 
DFTools.console.log("someMethod caught an error: ",err.message); 
... 

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

+0

मैंने इसे हमेशा "अपवाद हैंडलिंग" के रूप में संदर्भित किया है, हालांकि एक नई ब्लॉक ("...") 'को पकड़ने के लिए एक कैच ब्लॉक को ट्रिगर करने के लिए, तो ... – Josh

+5

ठीक है आप जो कुछ भी चाहते हैं उसे फेंक सकते हैं -' फेंकें "हाय माँ!"; 'पूरी तरह से मान्य है। – Pointy

+0

हां। शायद मुझे कहना चाहिए कि * मैं * नई त्रुटि ऑब्जेक्ट्स, या ऑब्जेक्ट्स जो त्रुटि से प्राप्त होता है फेंक देता हूं। – Josh

उत्तर

11

यह थोड़ा सा व्यक्तिपरक है, लेकिन मेरे लिए एक त्रुटि तब होती है जब कोई या कुछ गलत, अनुचित या अमान्य करता है। यह एक वाक्यविन्यास त्रुटि, एक तार्किक त्रुटि, एक पठन त्रुटि, उपयोगकर्ता त्रुटि, या यहां तक ​​कि एक सामाजिक त्रुटि हो सकती है। यह एक अमूर्त अवधारणा है।

दूसरी तरफ एक अपवाद एक वस्तु है जो कोड में एक निश्चित स्थिति होने पर बनाई और फेंक दिया जाता है। यह एक वैचारिक त्रुटि के अनुरूप हो सकता है या नहीं भी हो सकता है। तो मेरे लिए, उचित नामकरण "अपवाद" है।

+0

मुझे यह पसंद है - यह मुझे समझ में आता है – Josh

+3

ठीक है। किसी मित्र के साथ इस विषय पर चर्चा के बाद, मैं इस जवाब को स्वीकार करने पर गंभीरता से विचार कर रहा हूं। मेरी सोच यहाँ है। टिप्पणियों में @Pointy ने जो कहा, उसके साथ आपने जो कहा, उसे लेना: आप कुछ भी फेंक सकते हैं। जो कुछ भी 'पकड़' पकड़ता है वह अपवाद है। यह हो सकता है कि अपवाद एक त्रुटि है। इस प्रकार 'अपवाद' उचित शब्द है। – Josh

+0

धन्यवाद। मैंने दिन के लिए अपनी प्रतिनिधि सीमा को मारा है, इसलिए आप जितना चाहें उतना समय ले सकते हैं। – tloflin

0

क्या आप एक कैच ब्लॉक में मिलता है एक अपवाद है, इसलिए मैं एक अपवाद के रूप में यह नाम ...

यदि यह गलती से हुआ है - मैं अपने कोड & मैं आमतौर पर की उम्मीद नहीं करते में यह संभाल कर सकते हैं इसे कैच ब्लॉक

एचटीएच में देखें।

1

अपवाद कुछ ऐसा है जिसे आप फ़ाइल खोलने के प्रयास में उदाहरण के लिए "फ़ाइल अपवाद नहीं मिला" का सामना कर सकते हैं। दूसरी तरफ, त्रुटियां ऐसी चीज हैं जिन्हें आप प्रवाह पर ढेर की तरह नहीं देख सकते हैं या पर्याप्त स्मृति नहीं।

एक अपवाद एक ऐसे कार्य से बाहर एक वैकल्पिक तार्किक तरीका है जो तार्किक परिणाम उत्पन्न नहीं करता है। एक अपवाद यह भी बताता है कि ऐसा क्यों होता है कि यह इस तरह क्यों मौजूद है। फ़ाइल खोलने के लिए, फिर से, एक फ़ाइल हैंडल एक तार्किक परिणाम है और यदि फ़ाइल मौजूद नहीं है (एक संभावित अपवाद) या यह फ़ोल्डर एक फ़ाइल नहीं है (एक और संभावित अपवाद)।

+0

+1: यह विषय पर मेरे विचार के समान है। अपवाद की उम्मीद की जा सकती है, त्रुटियां नहीं हो सकती हैं। – CAbbott

+0

तो अगर मैं आपको सही ढंग से समझता हूं, तो आप सुझाव देते हैं कि मुझे वास्तव में क्या होता है इसके आधार पर लॉग इन करना चाहिए? यही है, मैं निर्धारित करता हूं कि यह कब त्रुटि है और जब यह अपवाद है? आईई अगर यह एक AJAX कॉल के चारों ओर एक कोशिश/पकड़ ब्लॉक है तो यह एक अपवाद है, लेकिन स्मृति त्रुटि से बाहर, ठीक है, एक त्रुटि है? – Josh

+0

एक अपवाद एक ऐसे कार्य से बाहर निकलने का एक वैकल्पिक तरीका है जो तार्किक परिणाम उत्पन्न नहीं करता है। एक अपवाद यह भी बताता है कि ऐसा क्यों होता है कि यह इस तरह क्यों मौजूद है। फ़ाइल खोलने के लिए, फिर से, एक फ़ाइल हैंडल एक तार्किक परिणाम है और यदि फ़ाइल मौजूद नहीं है (एक संभावित अपवाद) या यह फ़ोल्डर एक फ़ाइल नहीं है (एक और संभावित अपवाद)। यह इस तरह की स्थिति है मैं अपवाद का उपयोग करूंगा। तो AJAX कॉल अपवाद फेंक देना चाहिए। :- डी – NawaMan

1

जावास्क्रिप्ट में इसे त्रुटि कैचिंग कहा जाता है। तो मैं सुझाव दूंगा कि आप अपवाद के बजाय त्रुटि का उपयोग करें। "ई" का उपयोग करके बीच में विकल्प छोड़ दें। मोज़िला के उदाहरणों की तरह। Mozilla Core JavaScript 1.5 Reference

+1

अहह ... लेकिन http://w3schools.com/js/js_throw.asp कहते हैं, "फेंक स्टेटमेंट आपको अपवाद बनाने की अनुमति देता है।" – Josh

+2

w3schools एक निश्चित संदर्भ साइट के बजाय ट्यूटोरियल्स का एक सेट है। –

+0

@ डैनियल: धन्यवाद। यह CSmooth.net के उत्तर – Josh

4

ECMAScript specification उन्हें अपवाद कहते हैं। आप भी ऐसा ही करना चाहेंगे।

अपने लॉगिंग अधिक सूचनात्मक बनाने के लिए:

catch(ex) { 
    DFTools.console.log("someMethod caught an exception of type " 
     + ex.name + ": ", ex.message); 

तुम भी ध्यान रखें कि अपवाद (दुर्भाग्य से) किसी भी प्रकार का हो सकता है में रखना चाहते हो सकता है, और इसलिए जरूरी name और message गुण नहीं है:

catch(ex) { 
    if (ex.message && ex.name) {   
     DFTools.console.log("someMethod caught an exception of type " 
      + ex.name + ": ", ex.message); 
    } else /* deal with it somehow */ 

इस रूप में सुंदर हर जगह दोहराने के लिए बोझिल देखने के लिए शुरू कर रहा है, तो आप एक समारोह में यह कब्जा करने के लिए चाहते हो सकता है:

function logExceptions(methodName, action) { 

    try { 

     action(); 

    } catch (ex) { 
     if (ex.message && ex.name) {   
      DFTools.console.log("someMethod caught an exception of type " 
       + ex.name + ": ", ex.message); 
     } else { 
      DFTools.console.log("someMethod caught a poorly-typed exception: " + ex); 
     } 
    } 
} 

अब आप कह सकते हैं:

logExceptions(function() { 

    // do some risky stuff... 

}); 
+0

एचए! दरअसल ईसीएमएस्क्रिप्ट स्पेक "त्रुटि अपवाद" कहता है! – Josh

+2

हां, सभी मानक अपवाद निर्माता अपवाद के बजाए त्रुटि का उपयोग करते हैं ... लेकिन यह आपके लिए जेएस है! :) लेकिन शायद ऐसा इसलिए है क्योंकि उन अपवाद कार्यों को त्रुटियों को इंगित करना है; अपवाद के अन्य उपयोग नहीं हो सकता है। उदाहरण के लिए, मोज़िला में जावास्क्रिप्ट 1.7 में "जेनरेटर" नामक एक एक्सटेंशन है जो अनुक्रम के अंत को इंगित करने के लिए अपवाद का उपयोग करता है, और अपवाद प्रकार 'स्टॉपइटरेशन' है - "त्रुटियों" का कोई उल्लेख नहीं है, जो समझ में आता है। तो पागलपन के लिए कुछ विधि हो सकती है ... –

+0

@ जोश - ऊपर दिए गए मेरे उत्तर को संपादित करने से पहले आपकी मूल टिप्पणी है, जिसमें आपने पूछा कि अंतर्निर्मित अपवाद निर्माता "त्रुटि" शब्द का उपयोग क्यों करते हैं। नया जवाब है: आप क्या कल्पना पढ़ रहे हैं? जो संस्करण मैंने लिंक किया है वह अपवादों को "अपवाद" के रूप में संदर्भित करता है। यह त्रुटियों को इंगित करने वाले अपवादों के लिए विशेष रूप से संदर्भित करने के लिए "त्रुटि अपवाद" शब्द का उपयोग करता है। यह सभी अपवाद नहीं है। –

1

प्रमुख अस्वीकरण: मैं विचार नहीं करते यह करने के लिए एक "सही" जवाब नहीं है। यहां व्यक्त विचार व्यक्तिपरक और व्यक्तिगत हैं। और भी यह है कि जिन विचारों को मैं espouse के बारे में सोच रहा हूं वे केवल उपयोगी हैं यदि आप अलग-अलग चीजों को अलग-अलग, अहम, दोषों के साथ करने जा रहे हैं ... क्योंकि आप डैनियल ईरविकियर के सूचनात्मक उत्तर के अनुसार सिस्टम का उपयोग कर सकते हैं। इसके साथ दिमाग में:

मेरा तर्क है कि "एक असाधारण असाधारण है"। एक त्रुटि कम अप्रत्याशित है।

अस्वीकरण: निम्नलिखित छद्म कोड अच्छा नहीं है; यह केवल मेरे मामले को स्पष्ट करने के बारे में सोचने वाले न्यूनतम मामले के रूप में कार्य करता है।

नोट: इस विचार प्रयोग में, GetFile निर्दिष्ट फ़ाइल नहीं मिल पाती है अगर इसे निर्दिष्ट फ़ाइल नहीं मिलती है।

function AlwaysGetFile(name){ 
    var file = null; 
    if(FileExists(name)){ 
     file = GetFile(name); 
     if(typeof file === "undefined"){ 
      throw new "couldn't retrieve file" EXCEPTION 
     } 
    } 
    else{ 
     throw new "file does not exist" ERROR 
    } 
    return file; 
} 
मामले कि एक उपभोक्ता एक फ़ाइल नाम जो मौजूद नहीं है, कोई त्रुटि हो जाएगा के साथ GetFileOrThrow कॉल में

। मेरे दिमाग में भेद वास्तव में है कि उच्च स्तरीय कोड (या उपयोगकर्ता इनपुट) कुछ गलत कर रहा है ... इस फ़ंक्शन को उस उच्च-स्तरीय कोड के लिए एक त्रुटि को पार करना होगा जो इस परिणाम के बारे में क्या करना है, यह तय कर सकता है। इसे इस तरह विचार करें ... इस समारोह किसी भी लेने वाली कार्यों के लिए कह रही है की जाएगी:

Look, my friend, I know what's going on here: it is an ERROR to request BobAccounts.xml, so don't do it again! Oh, and if you think you now know what might have gone wrong (having abused me), go ahead and try to recover from it!

अब मामले पर विचार किसी कारण से इसे पुनः प्राप्त करने में विफल रहता है इस समारोह का नाम लेता है, की जाँच करता है कि फ़ाइल मौजूद है और फिर उस। यह एक अलग स्थिति है। वास्तव में कुछ अप्रत्याशित हुआ है। और क्या है, उपभोग करने वाला कोड को दोष नहीं देना है। अब हम वास्तव में इस समारोह किसी भी लेने वाली कार्यों के लिए कहना चाहता हूँ:

Oh fiddlesticks! Sorry about this, I humbly beg your pardon but something EXCEPTIONAL that I don't really understand has gone wrong. I don't think that your request for BobAccounts.xml was unreasonable... and I know I should be fulfilling it for you. Since I'm lower level code than you, I really ought to know what's going on... but I don't... and since you've less chance than me of understanding this EXCEPTIONAL situation, I think you'd probably best just stop what you're doing and let this message go all the way to the top... I mean, there is something seriously fishy going on here.

तो मुझे लगता है कि मेरे सारांश यह है: यदि गलती उच्च आदेश कोड में हुआ (आप बुरा डेटा पारित किए गए) एक त्रुटि फेंक देते हैं। अगर गलती कम ऑर्डर कोड में होती है (एक फ़ंक्शन जिसे आप निर्भर करते हैं, जिस तरह से आप समझ में नहीं आते थे और योजना नहीं बना सकते थे) एक बहिष्कार फेंक देते हैं ... और अगर गलती उस समारोह में हुई जो आप वर्तमान में लिख रहे हैं .. ठीक है, दुह, अगर आप इसके बारे में जानते हैं तो इसे ठीक करें!

और, आखिरकार, मूल प्रश्न का अधिक जवाब देने के लिए: त्रुटियों और बहिष्कारों को संभालने के मामले में, मेरी सलाह होगी: सभी त्रुटियों को गहन रूप से संभालें (वैकल्पिक रूप से उन्हें लॉगिंग करें) ... लेकिन सावधानी से सावधानी बरतें; केवल एक अपवाद से पुनर्प्राप्त करने का प्रयास करें यदि आप वास्तव में सुनिश्चित हैं कि आप जानते हैं कि यह क्या है और यह क्यों हुआ है, अन्यथा इसे बबल करें (यदि आपको करना है तो इसे फिर से बनाना)।

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