2010-03-12 38 views
13

क्या आप कृपया मुझे बता सकते हैं कि त्रुटि और अपवाद के बीच क्या अंतर है?.NET में त्रुटि और अपवाद के बीच क्या अंतर है?

+3

+1 दिलचस्प सवाल, मैंने कभी यह विचार नहीं दिया है। –

+3

आप "त्रुटि" से क्या मतलब चाहते हैं उसे स्पष्ट करना चाहते हैं, क्योंकि उस शब्द का उपयोग संदर्भों की एक विस्तृत श्रृंखला में भी किया जाता है, यहां तक ​​कि .NET दुनिया में भी। यहां तक ​​कि "अपवाद" Win32 संरचित अपवाद हैंडलिंग (जो रिपोर्टिंग त्रुटियों के लिए एक विंडोज ऑपरेटिंग सिस्टम तंत्र है) के बीच संदिग्ध हो सकता है और 'System.Eceptionception' प्रबंधित किया गया है (जो रिपोर्टिंग त्रुटियों के लिए सीएलआर तंत्र है)। –

+0

संबंधित (जावा-विशिष्ट): http://stackoverflow.com/questions/912334/differences-betweeen-exception-and-error – Helen

उत्तर

12

एक अपवाद एक वर्ग है जो भाषा अर्थशास्त्र का लाभ उठाता है। जैसा कि अन्य ने कहा है, अपवादों ने पकड़े जाने तक ढेर को निष्पादित करने में बाधा डाली। एक अपवाद का उपयोग किसी त्रुटि को व्यक्त करने के लिए किया जा सकता है, लेकिन अधिक आम तौर पर यह व्यक्त करने के लिए उपयोग किया जाता है कि कुछ असाधारण हुआ है।

दूसरी तरफ त्रुटियां असाधारण हो सकती हैं या नहीं।

त्रुटियों के कई प्रकार के होते हैं:

  • उपयोगकर्ता त्रुटि - यह (स्थिर टाइप किया भाषाओं में संकलन नहीं करना चाहिए गतिशील भाषाओं में, वे हैं - इस एक अपवाद
  • सिंटैक्स त्रुटि के बिना संभाला जाना चाहिए एक छोटे से कठिन को खोजने के लिए)
  • रनटाइम त्रुटि - यह या तो एक अपवाद में परिणाम होगा, या चुपचाप असफल (आमतौर पर अप्रत्याशित परिणाम बनाने)

वास्तव में, अपवाद एस रनटाइम त्रुटियों को संभालने के लिए सीमित होना चाहिए, क्योंकि खराब डेटा इनपुट करने वाला उपयोगकर्ता "असाधारण" नहीं है। इनपुट (सामने के अंत सत्यापन)

  • रोकें कायम किया जा रहा (बैक-एंड सत्यापन)
  • से गलत डेटा होने से

    • रोकें बुरा डेटा: उपयोगकर्ता त्रुटियों को संभाल करने के लिए, आप निम्नलिखित दृष्टिकोण रखना चाहिए

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

    +1

    मैं तर्क दूंगा कि उपयोगकर्ता त्रुटियों को आंतरिक रूप से अपवादों के साथ संभाला जा सकता है (कहें, एक सत्यापन विधि जो कस्टम अपवाद देता है)। हालांकि, उन अपवादों को एक दोस्ताना तरीके से पकड़ा और रिपोर्ट किया जाएगा। यह नियंत्रण का सामान्य प्रवाह नहीं है, न ही यह प्रदर्शन प्रभाव होने की संभावना है। – TrueWill

    +0

    @TreueWill - मैं सहमत हूं। मुझे एक बार प्रवाह नियंत्रण "प्रतिमान" के रूप में अपवाद पकड़ने/पुनर्विचार का उपयोग करने की आवश्यकता थी। यह एक विदेशी मामला था, लेकिन मुझे खुशी थी कि मुझे जो कुछ चाहिए उसे पूरा करने के लिए कुछ अस्तित्व में था ... @ माइकल, कोई डाउनवोट नहीं, लेकिन मैं पूरी तरह से सहमत नहीं हूं। – overslacked

    +3

    मुझे लगता है कि मैंने इसे पर्याप्त रूप से पर्याप्त नहीं बताया था। अपवादों को प्राथमिक तंत्र नहीं होना चाहिए जो उचित इनपुट सुनिश्चित करता है। यदि खराब डेटा प्रमाणीकरण पास करता है, तो यह एक असाधारण मामला बन जाता है। मेरा मतलब था जब मैंने कहा "एक त्रुटि व्यक्त करने के लिए एक अपवाद का उपयोग किया जा सकता है।" मैं "कैन" इटालिक्स बनाउंगा। –

    13

    एक अपवाद System.Exception कक्षा से प्राप्त एक प्रकार का एक वस्तु है। इसका उपयोग throw कथन में catch क्लॉज को try ब्लॉक में नियंत्रण स्थानांतरित करने के लिए कहीं भी कॉल स्टैक पर स्थानांतरित करने के लिए किया जाता है।

    एक त्रुटि केवल कुछ कोड या संदेश है जिसे आप समझाने के लिए हैं। त्रुटि कोड के साथ समस्या यह है कि आप उन्हें अनदेखा करने का निर्णय ले सकते हैं:

    MethodThatReturnsAnError(); 
    SomeCodeThatShouldNotExecuteOnError(); 
    

    वह कॉल केवल लौटाए जाने पर त्रुटि कोड को अनदेखा कर देगा। हालांकि:

    MethodThatThrowsAnException(); 
    SomeCodeThatShouldNotExecuteOnError(); 
    

    इस पर ध्यान नहीं दिया जा सकता है, और ढेर, अतीत "SomeCodeThatShouldNotExecuteOnError();" नियंत्रण को हस्तांतरित करेगा।

    +0

    मुझे नहीं पता कि मैं कहूंगा कि त्रुटि कोड के साथ कोई समस्या है, बल्कि अपवादों के साथ आप इस तथ्य का लाभ उठा सकते हैं कि "किसी को" अपवाद को संभालना होगा जबकि एक त्रुटि को नजरअंदाज किया जा सकता है। अपवाद त्रुटियों से बेहतर नहीं हैं। वे वही हैं जिन्हें उन्हें बुलाया जाता है, अपवाद। कुछ असाधारण हुआ है और प्रक्रिया प्रवाह में बाधा डाल रही है। –

    +4

    @ लुकासबी: तथ्य यह है कि एरर कोड को त्रुटि कोड के साथ समस्या _is_ अनदेखा किया जा सकता है। वह प्लस तथ्य यह है कि वे semantically हल्के हैं। –

    +1

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

    0

    अपवाद: जब कुछ कार्यवाही में कोई कदम विफल रहता है, तो उस क्रिया के बाद के सभी चरणों को निष्पादित नहीं किया जाता है। यह वह जगह है जहां अपवाद चमकते हैं।

    त्रुटि: तब होता है जब पहले मामले में आप वर्तमान कोड के निष्पादन को रोकना चाहते हैं, लेकिन इससे पहले कि आपको पहले आवंटित किसी भी संसाधन को मुक्त करने की आवश्यकता हो।


    ही कहा है,

    अपवाद वर्ग HResult property है। HRESULT एक 32-बिट मान है, जो तीन अलग-अलग क्षेत्रों में विभाजित है: एक गंभीरता कोड, एक सुविधा कोड, और त्रुटि कोड

    इस पोस्ट पर एक नज़र डालें, तो आप समझ बेहतर

    0

    अपवाद रिपोर्टिंग और निष्पादन विफलताओं से निपटने का एक तरीका है में मदद मिलेगी। दूसरे शब्दों में, वे त्रुटि शर्तों को संप्रेषित करने के लिए हैं (Framework Design Guidelines पुस्तक में क्रज़िट्टोफ कैवालिना को पैराफ्रेश करना)।

    2

    अपवादों को अनदेखा करने के लिए आपको कोड लिखना है। त्रुटि कोड आपको पर कोड लिखना नहीं है अनदेखा करें।

    +0

    मुझे यह पसंद है, इसलिए मैंने ऊपर उठाया। हालांकि, अपील करने के लिए, आपको अपवाद और त्रुटियों (अच्छी तरह से, त्रुटि कोड, जैसा कि आप कहते हैं) को पहले से ही समझना होगा। तो pithiness के लिए शीर्ष अंक, लेकिन मुझे यकीन नहीं है कि यह वास्तव में सवाल का जवाब :) :) – ChrisA

    +0

    हास्य के लिए upvote: डी – user2330678

    2

    आमतौर पर, मैं उन्हें वर्गीकृत के रूप में:

    त्रुटि - आवेदन के भीतर एक ज्ञात कार्यप्रवाह है। उदाहरण के लिए: प्रमाणीकरण के दौरान प्रदान नहीं किया गया उपयोगकर्ता नाम एक त्रुटि है।
    एप्लिकेशन इन परिस्थितियों को संभाल सकता है & उचित इनपुट और/या डेटा को अलग-अलग प्रक्रिया के लिए संकेत देने के लिए उपयोगकर्ता को अनुकूल संदेश दिखाने में सक्षम होगा।

    अपवाद - आमतौर पर आपके सिस्टम से बाहर निकलने पर और/या एप्लिकेशन में अप्रत्याशित कुछ होने पर फेंक दिया जाता है। उदाहरण के लिए: अपर्याप्त अधिकार या फ़ाइल मौजूद नहीं होने के कारण फ़ाइल हैंडल खोलना अपवाद फेंक सकता है।
    आमतौर पर इस मामले में, एप्लिकेशन इन अपवादों को पकड़ सकता है और/या सिस्टम में सभी अपवादों को संभालने के लिए एक सामान्य हैंडलर लिख सकता है।

    अंगूठे के नियम के रूप में, यदि आपको पता है कि कोई विशेष मामला मौजूद है जिसके कारण एप्लिकेशन काम नहीं कर सकता है, तो इसे & त्रुटि के रूप में लेबल करें।

    सभी शेष 'अज्ञात-अनन्य' तब अपवादों की श्रेणी में आ सकते हैं।

    एचटीएच।

    1

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

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

    त्रुटियाँ 2 स्तर

    • पृष्ठ स्तरीय (पेज निर्देशक पर उपयोग ErrorPage विशेषता)
    • अनुप्रयोग स्तर पर हो सकता है (वेब ​​में नियंत्रित किया जा करने की आवश्यकता है।config)

    संकलन CustomError ... CustomError त्रुटि .... त्रुटि संकलन नोट- पृष्ठ स्तरीय त्रुटि निवारण अनुप्रयोग स्तर त्रुटि हैंडलिंग ओवरराइड करता है।

    एक्सेप्शन हैंडलिंग: ->

    0

    त्रुटियाँ प्रतियोगिताएं हैं। अपवाद वर्ग त्रुटियों का प्रतिनिधित्व करता है जो अनुप्रयोग निष्पादन (रनटाइम) के दौरान होते हैं और प्रयास पकड़ने वाले ब्लॉक का उपयोग करके उन्हें संभालने के लिए एक तंत्र प्रदान करते हैं। त्रुटियां रनटाइम या कंपाइलर त्रुटि/एस हो सकती हैं।

    त्रुटि की घटनाओं के उदाहरण: HttpApplication.Error System.Web dll की घटना, System.IO की FileSystemWatcher.Error घटना दोनों DLLs त्रुटि घटना का एक ही परिभाषा है

    public event EventHandler Error 
    

    .Net Framework 4.5 प्रलेखन से https://msdn.microsoft.com/en-us/library/system.exception(v=vs.110).aspx

    अपवाद वर्ग अनुप्रयोग निष्पादन के दौरान होने वाली त्रुटियों का प्रतिनिधित्व करता है।

    त्रुटियाँ और अपवाद

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

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

    प्रोग्राम त्रुटियां। एक प्रोग्राम त्रुटि एक रन-टाइम त्रुटि होती है जिसे बग-फ्री कोड लिखकर जरूरी नहीं किया जा सकता है।

    कुछ मामलों में, एक प्रोग्राम त्रुटि अपेक्षित या नियमित त्रुटि स्थिति को प्रतिबिंबित कर सकती है। इस मामले में, आप प्रोग्राम त्रुटि से निपटने के लिए अपवाद हैंडलिंग का उपयोग करना और ऑपरेशन को फिर से प्रयास करना चाहते हैं।

    अन्य मामलों में, एक प्रोग्राम त्रुटि एक अनपेक्षित त्रुटि स्थिति को दर्शाती है जिसे आपके कोड में नियंत्रित किया जा सकता है।

    सिस्टम विफलताओं। एक सिस्टम विफलता एक रन-टाइम त्रुटि है जिसे सार्थक तरीके से प्रोग्रामेटिक रूप से संभाला नहीं जा सकता है। उदाहरण के लिए, यदि कोई भी सामान्य भाषा रनटाइम अतिरिक्त मेमोरी आवंटित करने में असमर्थ है, तो कोई भी विधि OutOfMemoryException अपवाद फेंक सकती है। आमतौर पर, अपवाद हैंडलिंग का उपयोग करके सिस्टम विफलताओं को नियंत्रित नहीं किया जाता है। इसके बजाय, आप AppDomain.UnhandledException जैसे ईवेंट का उपयोग करने और पर्यावरण को कॉल करने में सक्षम हो सकते हैं।अपवाद जानकारी लॉग करने के लिए विफलता विधि और आवेदन समाप्त होने से पहले विफलता के उपयोगकर्ता को सूचित करें।

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