2009-06-13 21 views
20

मैं सी # में एक कस्टम क्लास लिख रहा हूं और यदि कुछ तरीकों से लोग गलत इनपुट देते हैं तो मैं कुछ अपवाद फेंक रहा हूं। यदि अपवाद फेंक दिया गया है, तो फेंकने के बाद विधि में से कोई भी कोड अभी भी निष्पादित किया जाएगा? क्या मुझे फेंकने के बाद ब्रेक लगाना है, या फेंकने से हमेशा इस विधि को छोड़ दिया जाता है?क्या मुझे अपवाद फेंकने के बाद तोड़ना है?

+1

इसे तीन प्रश्नों में विभाजित करें। (1) फेंकने के बाद विधि में से कोई भी कोड निष्पादित किया जाएगा? हाँ। यदि अपवाद एक कोशिश के अंदर था तो मिलान पकड़ने वाले ब्लॉक या अंत में ब्लॉक के अंदर कोड निष्पादित किया जाएगा। यदि कोई कोशिश ब्लॉक नहीं है तो नहीं। अंततः निकटतम संलग्नक में शाखाओं को नियंत्रित करें, पकड़ें या (vb में) अपवाद फ़िल्टर स्टैक को अवरुद्ध करें। –

+2

(2) क्या मुझे फेंकने के बाद ब्रेक देना है? नहीं, ऐसा कभी नहीं करें। फेंक कथन का अंतिम बिंदु पहुंच योग्य नहीं है; एक फेंक को कंपाइलर द्वारा गेटो के रूप में माना जाता है। फेंकने के तुरंत बाद एक बयान पहुंच योग्य नहीं है और कभी निष्पादित नहीं होगा। –

+1

(3) क्या फेंक हमेशा विधि को छोड़ देता है? नहीं। यदि फेंक एक कोशिश में है और कोशिश में मिलान करने वाला पकड़ ब्लॉक है तो पकड़ ब्लॉक अपवाद "खा सकता है"। केवल अगर कोई पकड़ ब्लॉक नहीं है तो अपवाद एक गैर-स्थानीय कॉलो स्टैक को प्राप्त करता है। –

उत्तर

30

जब आप throw अपवाद करते हैं, तो निष्पादित करने के लिए अगला कोड किसी भी कैच ब्लॉक होता है जो विधि (यदि कोई हो) में फेंक देता है, तो finally block (यदि कोई हो)। आप एक कोशिश कर सकते हैं, कोशिश कर सकते हैं, एक कोशिश-अंत में या आखिरकार कोशिश कर सकते हैं। फिर, अगर अपवाद को संभाला नहीं जाता है, तो कैच ब्लॉक द्वारा फिर से फेंक दिया जाता है या पकड़ा नहीं जाता है, कॉलर को नियंत्रण वापस कर दिया जाता है। उदाहरण के लिए, आप इस कोड से "Yes1, Yes2, Yes3" मिल जाएगा ...

try 
{ 
    Console.WriteLine("Yes1"); 
    throw (new Exception()); 
    Console.WriteLine("No1"); 

} 
catch 
{ 
    Console.WriteLine("Yes2"); 
    throw; 
    Console.WriteLine("No2"); 
} 
finally 
{ 
    Console.WriteLine("Yes3"); 
} 

Console.WriteLine("No3"); 
+0

यह मेरे उत्तर में एक अपवाद (छोटा ई) होगा। मैं एक अपवाद की तर्ज पर सोच रहा था जिसका उपयोग आम संदर्भ में किया जाएगा और एक गोटो स्टेटमेंट की तरह इस्तेमाल नहीं किया जाएगा। –

+0

@jarrett: यह बिल्कुल सामान्य संदर्भ है, सिवाय इसके कि फेंक फंक्शन कॉल के अंदर छिपा हुआ है। – configurator

27

फेंक स्टैक को ऊपर ले जाएगा, इस प्रकार विधि से बाहर निकलें।

+2

धन्यवाद। इस तरह के एक बुनियादी सवाल पूछने के लिए खेद है। – Ross

1

आप एक कोशिश में अपने कोड लपेटा गया है ... पकड़ो ... अंत में ब्लॉक, तो कोड के तहत अंत में हमेशा निष्पादित होगा। उदाहरण के लिए:

Try 
    ' do some stuff here 
    ' Examine user input 
    If user input isn't valid 
     Throw new exception 
Catch 
    Throw ' Just re-throws the same exception 
Finally 
    ' This code will execute, no matter what - exception or not 
End Try 
1

आपके वास्तविक प्रश्न के विपरीत: आप उपयोगकर्ता को सत्यापन जानकारी प्रदान करने के लिए अपवादों का उपयोग करके पुनर्विचार करना चाहेंगे।

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

+0

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

+0

यह एक टिप्पणी है और वास्तव में ओपी का जवाब नहीं है। – Drellgor

3

मैं एक डीबगर के साथ अपने प्रोग्राम के माध्यम से कदम उठाने की सलाह देता हूं तो आप अपने लिए देखेंगे कि क्या हो रहा है। सीखने के लिए बहुत उपयोगी!

+0

यह एक महान टिप है। वह में स्वयं कर लूँगा! धन्यवाद – Ross

+0

यह एक "टिप" है और मूल प्रश्न का उत्तर नहीं है। – Drellgor

+0

वाह मेरा "जवाब नहीं" ध्वज विवादित था। – Almo

2

मैं यहां मूल पोस्ट का उत्तर ढूंढ रहा था और लगभग Eric Lippert द्वारा पोस्ट किए गए एक बहुत ही मूल्यवान उत्तर को याद किया। टिप्पणियों में उनके उत्तर यहां पोस्ट किए गए हैं:

इसे तीन प्रश्नों में विभाजित करें।

(1) फेंकने के बाद विधि में से कोई भी कोड निष्पादित किया जाएगा?
हाँ। यदि अपवाद एक कोशिश के अंदर था तो मिलान पकड़ने वाले ब्लॉक या अंत में ब्लॉक के अंदर कोड निष्पादित किया जाएगा। यदि कोई कोशिश ब्लॉक नहीं है तो नहीं। अंततः निकटतम संलग्नक में शाखाओं को नियंत्रित करें, पकड़ें या (vb में) अपवाद फ़िल्टर स्टैक को अवरुद्ध करें।

(2) क्या मुझे फेंकने के बाद ब्रेक देना है?
नहीं, ऐसा कभी नहीं करें। फेंक कथन का अंतिम बिंदु पहुंच योग्य नहीं है; एक फेंक को कंपाइलर द्वारा गेटो के रूप में माना जाता है। फेंकने के तुरंत बाद एक बयान पहुंच योग्य नहीं है और कभी निष्पादित नहीं होगा।

(3) क्या फेंक हमेशा विधि को छोड़ देता है?
नहीं। यदि फेंक एक कोशिश में है और कोशिश में मिलान करने वाला पकड़ ब्लॉक है तो पकड़ ब्लॉक अपवाद "खा सकता है"। केवल अगर कोई पकड़ ब्लॉक नहीं है तो अपवाद एक गैर-स्थानीय कॉलो स्टैक को प्राप्त करता है।

यदि आपके पास इसके बारे में अधिक प्रश्न हैं, तो मैं सी # विनिर्देश पढ़ने की सलाह देता हूं; यह सब व्यवहार स्पष्ट रूप से दस्तावेज है।

आखिरकार, ऐसा लगता है कि आप "हड्डी के बने हुए" अपवादों को फेंक रहे हैं, जैसा कि "हे बोनहेड कॉलर, मैंने आपको बताया कि मुझे वह डेटा कभी न दें"। यह बहुत अच्छा है क्योंकि यह कॉलर्स में बग को रोकता है। लेकिन अगर आप ऐसा करते हैं, तो आपको यह सुनिश्चित करना चाहिए कि कॉलर को यह जानने का कोई तरीका है कि आप क्या उम्मीद करते हैं! यदि कॉलर यह नहीं समझ सकता कि आप अपने दस्तावेज़ीकरण के आधार पर फेंकने या नहीं जाने जा रहे हैं, तो आपने एक हड्डी का अपवाद नहीं बनाया है, तो आपने एक परेशानी अपवाद बना दिया है। विवरण के लिए http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx देखें।

+0

आपके पहले बिंदु के बारे में: सी # में अब अपवाद फ़िल्टर भी हैं; यह सिर्फ वीबी के लिए नहीं है। –

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