न्यू प्रोग्रामर्स के लिए एक्सेप्शन हैंडलिंग कैसे सिखाएं? [बन्द है]


21

कैसे आप प्रोग्रामर को एक्सेप्शन हैंडलिंग सिखाते हैं। अन्य सभी चीजें आसानी से सिखाई जाती हैं - डेटा संरचनाएं, ASP.NET, WinForms, WPF, WCF - आप इसे नाम देते हैं, सब कुछ आसानी से सिखाया जा सकता है।

एक्सेप्शन हैंडलिंग के साथ, उन्हें ट्राइ-कैच सिखाना-अंत में एक्सेप्शन हैंडलिंग की सिंटैक्टिक प्रकृति है।

हालाँकि जो सिखाया जाना चाहिए, वह है - आप अपने ब्लॉक के किस हिस्से को आज़माते हैं ? आप पकड़ ब्लॉक में क्या करते हैं ?

इसे एक उदाहरण से स्पष्ट करता हूं।

आप एक विंडोज फॉर्म प्रोजेक्ट (एक छोटी उपयोगिता) पर काम कर रहे हैं और आपने इसे नीचे 3 अलग-अलग परियोजनाओं के साथ डिजाइन किया है।

  1. UILayer
  2. BusinessLayer
  3. dataLayer

यदि एक अपवाद (हमें एक XDocument लोड करने का अपवाद कहता है) DataLayer (UILayer को BusinessLayer कहते हैं जो DataLayer को कॉल करता है) पर उठाया जाता है, तो क्या आप निम्नलिखित कार्य करते हैं

//In DataLayer
try {
    XDocument xd_XmlDocument = XDocument.Load("systems.xml");
} 
catch(Exception ex)
{
    throw ex;
}

जो फिर से BusinessLayer में फेंक दिया जाता है और जो UILayer में पकड़ा जाता है, जहां मैं इसे लॉग फ़ाइल में लिखता हूं?

क्या यह है कि आप अपवाद हैंडलिंग के बारे में कैसे जाते हैं?


15
यदि आप कर रहे थे कि क्या करने जा रहा है, तो आप पकड़ (अपवाद पूर्व) {फेंक पूर्व नहीं करना चाहती; } - इसके बजाय बस {फेंक; }
स्टीवन एवर्स

4
आखिरकार ब्लॉक के बारे में मत भूलना?
क्रिस

1
आपको टैग में भाषा निर्दिष्ट करनी चाहिए। आप अपवादों के अधिकांश कार्यान्वयन के लिए और ब्लॉकों के बाहर की चीजों की अनदेखी करने के लिए सामान्य से अधिक विस्तार में हो रहे हैं। C ++ में, उदाहरण के लिए, अपवाद हैंडलिंग का सबसे महत्वपूर्ण हिस्सा यह जानना है कि अपवाद-सुरक्षित प्रोग्राम कैसे लिखना है।
डेविड थॉर्नले


मुझे आशा है कि आप जानते हैं कि किसी भी "अपवाद" को पकड़ना एक बुरा विचार है। आपके पास विशिष्ट अपवादों को पकड़ने और उनके अनुसार उन्हें संभालने के लिए नेस्टेड ब्लॉक होना चाहिए (न कि केवल अपवाद को फेंक दें)।
माइनसईवेन

जवाबों:


29

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

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

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


4
+1 के लिए "... क्योंकि यह वास्तव में कुछ भी नहीं संभालता है", अपवाद को संभालने के लिए नए लोग अक्सर सोचते हैं कि पकड़ने का मतलब है संभालना और पता नहीं कि क्या आप समस्या को ठीक करने के लिए कुछ नहीं करते हैं, यह अपवाद हैंडलिंग नहीं है, बस कोड ब्लोट।
जिमी होफा

13

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

नीचे पंक्ति: यह दिखाते हुए कि सी में त्रुटि को कैसे अंजाम दिया गया, छात्रों को यह समझ में आ जाएगा कि वास्तव में अपवाद क्या हैं और अपवादों को पकड़ना क्यों कि आप वास्तव में संभाल नहीं सकते हैं मूल रूप से डार्क एज में चीजों को करने का तरीका अनुकरण कर रहा है।


2
+1 पारंपरिक सी शैली रिटर्न कोड और त्रुटि संख्या में उन्हें अग्रणी दिखाने के शिक्षण अभ्यास के लिए और यह दर्शाता है कि यह खराब तरीके से काम करता है और इसलिए, यह सिखाता है कि यह कैसे काम करेगा एक शानदार!
Kanini

3
@Kanini: आम तौर पर मुझे लगता है कि अधिकांश अपेक्षाकृत नए / उच्च स्तर के निर्माण समस्याओं की तलाश में समाधान की तरह लगते हैं और गलत का उपयोग करना आसान है यदि आपको समझ में नहीं आता है कि वे किस समस्या को हल करने के लिए थे और उनका आविष्कार क्यों किया गया था।
dsimcha

मैं सहमत हूं कि अपवादों के बिना यह कैसे दिखाया जाएगा यह अच्छा है, लेकिन फिर यह समझाने का बोझ आता है कि अपवादों का उपयोग कब करना है और कब अन्य टेकनीक का उपयोग करना है (क्योंकि सभी स्थितियां असाधारण नहीं हैं)
Matthieu M.

@ मैथ्यू: ठीक है। लेकिन अगर आप समझते हैं कि एक वैक्यूम में उनके बारे में सीखने के बजाय, ऐतिहासिक समस्याओं को हल करने के लिए क्या किया जाता है, तो यह अधिक स्पष्ट हो जाता है कि गैर-असाधारण स्थितियों के लिए उनका उपयोग करना मूर्खतापूर्ण है।
dsimcha

ठीक है, इसीलिए आपको मेरा +1 मिला। मुझे लगा कि आपके उत्तर की व्याख्या "कभी किसी अन्य तंत्र का उपयोग न करें" के रूप में की जा सकती है :)
Matthieu M.

5

मैं इसकी संक्षिप्तताओं के लिए डिजाइन दिशानिर्देशों के साथ शुरू करूँगा और इसमें DO, DO NOT और AVOID शामिल हैं। यह कारण भी बताता है।

आपके उदाहरण के मामले में रहस्योद्घाटन अनुभाग रैपिंग अपवाद होगा

और उम्मीद करेगा कि इसे इस तरह से लिखा जाएगा। ध्यान दें कि यह एक विशिष्ट अपवाद को पकड़ता है और जानकारी जोड़ने का प्रयास करता है ताकि एक अधिक सार्थक संदेश प्रसारित हो। यह भी ध्यान दें कि लॉगिंग उद्देश्यों के लिए आंतरिक अपवाद अभी भी बनाए रखा गया है

//In DataLayer

try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
        throw new TransactionFileMissingException(
                     "Cannot Access System Information",ex);
}

UPDATE कानिनी पूछती है कि डेटा लेयर में यह अपवाद ब्लॉक होना भी सही है या फ़ाइल को बिजनेस लेयर के लिए उपलब्ध होना चाहिए।

पहले मैं यह बताना चाहूंगा कि रैपिंग अपवाद के लिए तर्क यह है

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

इसलिए यदि आपको लगता है कि उच्च परत में फ़ाइल के बारे में जानकारी होनी चाहिए तो आपकी डेटा परत इस तरह दिखनी चाहिए

//In DataLayer

XDocument xd_XmlDocument = XDocument.Load("systems.xml");

नो ट्राई नो कैच।

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

एक उदाहरण के रूप में इस विशेष उदाहरण में XDocument.lad में निम्नलिखित समस्या है जो चार अपवादों को फेंक सकती है

  • ArgumentNullException
  • सुरक्षा अपवाद
  • FileNotFoundException
  • UriFormatException

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

 if (File.Exists("systems.xml")) 
     XDocument.Load("systems.xml");

SecurityException और भी ख़राब है क्योंकि इसके फेंके जाने के अन्य कारणों के बीच अगर किसी अन्य प्रक्रिया में एक विशेष फ़ाइल लॉक है तो आपको त्रुटि नहीं मिलेगी जब तक कि आप इसे पढ़ने के लिए खोलने का प्रयास नहीं करते क्योंकि कोई File.CanIOpenThis () विधि नहीं है। और अगर इस तरह की कोई विधि मौजूद है तो भी आपको File.Exists जैसी ही समस्या है


फिक्स: धन्यवाद! लेकिन क्या डेटा लेयर में यह अपवाद ब्लॉक होना भी सही है? फ़ाइल उपलब्ध है या नहीं की जाँच करने की पूरी बात चाहिए व्यापार परत में नहीं है? अन्यथा, मैं कोड लिखने के आपके तरीके से सहमत हूं।
कानूननी

फिक्स: मेरी मूल भाषा में, कनीनी का मतलब है एक कंप्यूटर जबकि कान का मतलब एक फल है;;
कनीनी

मैं बता सकता हूं कि आप मेरी त्रुटि से बहुत परेशान नहीं हैं, लेकिन मुझे बहुत खेद है और मैंने इसे सुधार लिया है।
कोनराड फ्रैक्स

1
फिक्स: परेशान? हर्गिज नहीं। बड़े ही आराम से। मेरे भाई ने हँसना बंद नहीं किया है क्योंकि मैंने इसे मुख्य रूप से बताया क्योंकि, मैं विषम आकार के अलावा किसी भी फल में नहीं मिलता ...
Kanini

4

एक भूमिका निभाते हैं। (यह एक मजाक पोस्ट नहीं है)

आपको एक कार्यशाला करनी चाहिए, जहाँ आप कॉल श्रृंखला से कार्य करते हैं। प्रत्येक व्यक्ति एक वस्तु है। आपको कुछ newbies और कुछ लोगों की ज़रूरत होगी जो "गेम" को समझते हैं।

फ़ाइल IO जैसी वास्तव में सरल समस्या का उपयोग करें। gui-> मॉडल> ​​file_io

फाइल रीडर होने वाले व्यक्ति को अगले एक को बताना होगा ...।

पहले इसे रिटर्न कोड के साथ करें। (पोस्ट-इट नोट्स का उपयोग करें?)

अगर बातचीत बस "कोड क्या कहता है" बहुत जल्द आप लोगों को यह महसूस करवा सकते हैं कि अपवाद असाधारण हैं।

वापसी कोड के लिए, एक पोस्ट इट नोट पास करें।

अपवादों के लिए, अपने हाथों को हवा में फेंकें और कहें कि समस्या क्या है।

फिर उन्हें "x को पकड़ें, x को फेंकें" और हो के खराब निदान को देखें कि GUI को केवल "मॉडल का अपवाद मिला" है।

मुझे लगता है कि यह आपके पास मौजूद लोगों को प्रशिक्षित करने के लिए काम करेगा क्योंकि लोग अन्य लोगों के साथ बातचीत को बहुत अच्छी तरह से समझते हैं।


भूमिका निभाने के विचार के लिए +1। हमने इसके बारे में पहले कभी नहीं सोचा था। जो कोई भी सोचा था कि शिक्षण प्रोग्रामिंग रोल प्ले के माध्यम से किया जा सकता है?
कनीनी

1

मैं उदाहरणों के लिए कक्षाओं के बच्चे / माता-पिता के संबंध को समझने के लिए आपको पहले अपवादों को समझने की कल्पना करूंगा। यदि आप समझते हैं कि एक बच्चे को माता-पिता से कार्यक्षमता विरासत में मिल सकती है, तो वे प्राथमिक स्तर पर यह समझने में सक्षम हो सकते हैं कि यदि किसी बच्चे को कोई समस्या है तो वह इसे संभाल नहीं सकता है तो वह इस समस्या (अपवाद) को अपने माता-पिता तक पहुंचा देगा और माता-पिता का सौदा होने देगा इसके साथ।

यह एक जंजीर संबंध बन जाता है जब तक कि आप एक ऐसी जगह के साथ समाप्त नहीं हो जाते हैं जहां कुछ जानता है कि अपवाद को कैसे संभालना है।

और जहां तक ​​अंत में जाता है यह तुच्छ हिस्सा है ... जब कोई समस्या होती है तो कुछ को संभालना होता है इसलिए कार्यक्रम को वसा से बाहर नहीं निकलता है, इसके बाद अंत में ब्लॉक को संभाला जाता है जो कि हमेशा कोशिश की पकड़ की परवाह किए बिना निष्पादित होता है। ।

इसका एक अच्छा उदाहरण नेटवर्किंग के साथ हो सकता है:

  • हम संबंध बनाते हैं
  • कनेक्शन ठीक है इसलिए हम इसका उपयोग करते हैं
  • जब हम बंद कर देते हैं और संसाधनों को मुक्त करते हैं

या अपवाद मामले में:

  • संबंध बनाओ
  • एक अपवाद होता है जो कुछ संभालता है
  • किस बिंदु पर हम कनेक्शन और संबंधित संसाधनों को मुक्त करते हैं

1

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

मेरा मानना ​​है कि एक्सेप्शन हैंडलिंग कोड की सराहना तुरंत होगी।


एक योजना की तरह लगता है। क्या आपके पास इंटरनेट में कोई नमूना कोड उपलब्ध है (जैसे, sourceforge.net) जो आप सुझाएंगे?
कानिनी

0

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


@ एडी: जब मैं सहमत हूं कि "अपवाद हैंडलिंग केवल तभी प्रतिक्रिया होगी जब कोई त्रुटि (या अपवाद) होती है", मैं इस कथन के बारे में निश्चित नहीं हूं कि "अपवाद हैंडलिंग और प्रवाह नियंत्रण कथन मूल रूप से समान हैं"। मैं आदरपूर्वक वहाँ असहमत हूँ। कैच ब्लॉक स्वीकार करता है कि उसे उस शर्त के तहत क्या करना चाहिए। हालांकि कोशिश ब्लॉक प्रवाह या नियंत्रण के बारे में बिल्कुल नहीं है। अंततः ब्लॉक, फिर से प्रवाह या नियंत्रण के बारे में बिल्कुल नहीं है। हो सकता है, मैंने आपके उत्तर को गलत समझा, लेकिन क्या आप मुझे और दूसरों के हित के लिए स्पष्ट कर सकते हैं?
7:48

0

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

यह विचार कि एक फ़ंक्शन में विभिन्न प्रकार के आउटपुट हो सकते हैं, और एक अपवाद एक उच्च-प्राथमिकता प्रकार है जैसे फ़ंक्शन से वापसी बहुत साफ है।

ध्यान रहे, मैं समझता हूं कि अधिकांश भाषा (कार्यान्वयन विवरण) में अपवाद कैसे काम करते हैं, लेकिन एक सार अर्थ में, यही हो रहा है।


0

प्रिटेंड एक बंदर कीबोर्ड का उपयोग कर रहा है

मैं अपने दोस्तों को बताता था कि जब वे यह नाटक करने के लिए कोड लिख रहे हैं कि एक बंदर कुंजीबोर में बैठा होगा और इस एप्लिकेशन का उपयोग करेगा।

इससे उन्हें सिखाया गया कि सभी प्रकार की चीजों का पूर्वानुमान कैसे लगाया जाए:

  • खोए आँकड़े
  • गुम फाइलें
  • अल्फा वर्ण जब आप संख्याओं की अपेक्षा करते हैं
  • शून्य से विभाजन

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


बंदर? मुझे लगता है, आपके व्यवसाय के उपयोगकर्ताओं ने कभी नहीं सुना; ;-)
कानिनी

@ काणीनी - अच्छा। वह मेरे मरीन कॉर्प्स दिनों में था। मैं चाहता था कि मेरे लोग बॉक्स के बाहर सोचें जब यह गलती से फंस गया। क्या मैंने सिर्फ त्रुटि फंसने की बात कही है ... मेरा मतलब था कि अपवाद को संभालना।
माइकल रिले - AKA Gunny
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.