मैं सी # में एक कस्टम क्लास लिख रहा हूं और यदि कुछ तरीकों से लोग गलत इनपुट देते हैं तो मैं कुछ अपवाद फेंक रहा हूं। यदि अपवाद फेंक दिया गया है, तो फेंकने के बाद विधि में से कोई भी कोड अभी भी निष्पादित किया जाएगा? क्या मुझे फेंकने के बाद ब्रेक लगाना है, या फेंकने से हमेशा इस विधि को छोड़ दिया जाता है?क्या मुझे अपवाद फेंकने के बाद तोड़ना है?
उत्तर
जब आप 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");
यह मेरे उत्तर में एक अपवाद (छोटा ई) होगा। मैं एक अपवाद की तर्ज पर सोच रहा था जिसका उपयोग आम संदर्भ में किया जाएगा और एक गोटो स्टेटमेंट की तरह इस्तेमाल नहीं किया जाएगा। –
@jarrett: यह बिल्कुल सामान्य संदर्भ है, सिवाय इसके कि फेंक फंक्शन कॉल के अंदर छिपा हुआ है। – configurator
फेंक स्टैक को ऊपर ले जाएगा, इस प्रकार विधि से बाहर निकलें।
धन्यवाद। इस तरह के एक बुनियादी सवाल पूछने के लिए खेद है। – Ross
आप एक कोशिश में अपने कोड लपेटा गया है ... पकड़ो ... अंत में ब्लॉक, तो कोड के तहत अंत में हमेशा निष्पादित होगा। उदाहरण के लिए:
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
आपके वास्तविक प्रश्न के विपरीत: आप उपयोगकर्ता को सत्यापन जानकारी प्रदान करने के लिए अपवादों का उपयोग करके पुनर्विचार करना चाहेंगे।
अपवाद बढ़ाना महंगा संसाधन-वार और धीमा है। यदि आपके पास कई सत्यापन नियम हैं जिन्हें आपको आवेदन करने की आवश्यकता है तो इनके लिए विशिष्ट कोड लिखें - आपको शायद उन चीजों के लिए अपवाद हैंडलिंग पर भरोसा करना चाहिए जिनकी आप उम्मीद नहीं करते हैं।
मैं इसके बारे में भी सोच रहा था। मैं एक उच्च स्कोर वर्ग लिख रहा हूं, और कन्स्ट्रक्टर "अधिकतम" परम ले सकता है। जो अधिकतम स्कोर उपलब्ध कराता है। ठीक है अगर वे मेरी कक्षा के समर्थन से बड़ी संख्या में गुजरते हैं, तो मैं अपवाद फेंक रहा था क्योंकि मैं नहीं चाहता था कि कन्स्ट्रक्टर खराब जानकारी के साथ समाप्त हो। मैं इस पर नया हूं, क्या ऐसा करने का एक बेहतर तरीका है? – Ross
यह एक टिप्पणी है और वास्तव में ओपी का जवाब नहीं है। – Drellgor
मैं एक डीबगर के साथ अपने प्रोग्राम के माध्यम से कदम उठाने की सलाह देता हूं तो आप अपने लिए देखेंगे कि क्या हो रहा है। सीखने के लिए बहुत उपयोगी!
मैं यहां मूल पोस्ट का उत्तर ढूंढ रहा था और लगभग Eric Lippert द्वारा पोस्ट किए गए एक बहुत ही मूल्यवान उत्तर को याद किया। टिप्पणियों में उनके उत्तर यहां पोस्ट किए गए हैं:
इसे तीन प्रश्नों में विभाजित करें।
(1) फेंकने के बाद विधि में से कोई भी कोड निष्पादित किया जाएगा?
हाँ। यदि अपवाद एक कोशिश के अंदर था तो मिलान पकड़ने वाले ब्लॉक या अंत में ब्लॉक के अंदर कोड निष्पादित किया जाएगा। यदि कोई कोशिश ब्लॉक नहीं है तो नहीं। अंततः निकटतम संलग्नक में शाखाओं को नियंत्रित करें, पकड़ें या (vb में) अपवाद फ़िल्टर स्टैक को अवरुद्ध करें।
(2) क्या मुझे फेंकने के बाद ब्रेक देना है?
नहीं, ऐसा कभी नहीं करें। फेंक कथन का अंतिम बिंदु पहुंच योग्य नहीं है; एक फेंक को कंपाइलर द्वारा गेटो के रूप में माना जाता है। फेंकने के तुरंत बाद एक बयान पहुंच योग्य नहीं है और कभी निष्पादित नहीं होगा।
(3) क्या फेंक हमेशा विधि को छोड़ देता है?
नहीं। यदि फेंक एक कोशिश में है और कोशिश में मिलान करने वाला पकड़ ब्लॉक है तो पकड़ ब्लॉक अपवाद "खा सकता है"। केवल अगर कोई पकड़ ब्लॉक नहीं है तो अपवाद एक गैर-स्थानीय कॉलो स्टैक को प्राप्त करता है।
यदि आपके पास इसके बारे में अधिक प्रश्न हैं, तो मैं सी # विनिर्देश पढ़ने की सलाह देता हूं; यह सब व्यवहार स्पष्ट रूप से दस्तावेज है।
आखिरकार, ऐसा लगता है कि आप "हड्डी के बने हुए" अपवादों को फेंक रहे हैं, जैसा कि "हे बोनहेड कॉलर, मैंने आपको बताया कि मुझे वह डेटा कभी न दें"। यह बहुत अच्छा है क्योंकि यह कॉलर्स में बग को रोकता है। लेकिन अगर आप ऐसा करते हैं, तो आपको यह सुनिश्चित करना चाहिए कि कॉलर को यह जानने का कोई तरीका है कि आप क्या उम्मीद करते हैं! यदि कॉलर यह नहीं समझ सकता कि आप अपने दस्तावेज़ीकरण के आधार पर फेंकने या नहीं जाने जा रहे हैं, तो आपने एक हड्डी का अपवाद नहीं बनाया है, तो आपने एक परेशानी अपवाद बना दिया है। विवरण के लिए http://blogs.msdn.com/ericlippert/archive/2008/09/10/vexing-exceptions.aspx देखें।
आपके पहले बिंदु के बारे में: सी # में अब अपवाद फ़िल्टर भी हैं; यह सिर्फ वीबी के लिए नहीं है। –
- 1. अपवाद फेंकने के बाद लौटने
- 2. इंटेलिजे में "अपवाद तोड़ना" है?
- 3. फेंकने के लिए क्या अपवाद?
- 4. अपवाद फेंकने
- 5. अपवाद फेंकने और पकड़ने
- 6. पकड़े गए अपवाद के तर्क के साथ फेंकने और फेंकने के बीच क्या अंतर है?
- 7. अपवाद फेंकने सेगमेंटेशन गलती
- 8. सी # फ़ाइनलाइज़र फेंकने अपवाद?
- 9. आखिरकार ब्लॉक में अपवाद फेंकने के बाद लौटाए गए मूल्य का क्या होता है?
- 10. अपवाद को फेंकने वाली फाइलें
- 11. अपवाद फेंकने के लिए अगर कथन?
- 12. ऑटोफोकस फेंकने का अपवाद
- 13. क्या घोषणा को फेंकने के बिना अपवाद फेंकने का कोई तरीका है?
- 14. अपरिवर्तनीय अपवाद को फेंकने योग्य
- 15. बूस्ट म्यूटेक्स फेंकने (विषम?) अपवाद
- 16. विशिष्ट अपवाद उपखंडों को फेंकने का उद्देश्य क्या है?
- 17. जेनेरिक अपवाद फेंकने से हतोत्साहित?
- 18. विंडोज सेवा में अपवाद फेंकने
- 19. फेंकने वाले सी ++ अपवाद (0xE06D7363)
- 20. एक कन्स्ट्रक्टर अपवाद फेंकने के बाद अंतिम रूप दिया जा सकता है?
- 21. क्या कोशिश ब्लॉक में अपवाद फेंकने में कुछ गड़बड़ है?
- 22. जावा: अपवाद-फेंकने वाला वर्ग?
- 23. सी # क्या मुझे फेंकने के लिए ट्रे/कैच की आवश्यकता है?
- 24. मुझे फ़ंक्शन को कब तोड़ना चाहिए?
- 25. अपवाद हैंडलिंग: अंत में फेंकने के बाद निष्पादित किया जाता है?
- 26. एएसपी.नेट एमवीसी - अपवाद फेंकने के लिए कहां?
- 27. मैच के बाद IllegalStateException फेंकने वाला मचर
- 28. अपवाद फेंकने के बाद भी प्रोग्राम निष्पादन जारी रखने के लिए कैसे?
- 29. अपवाद फेंकने के लिए किसकी जिम्मेदारी है ?; ओएस या प्रक्रिया?
- 30. केवल अपवाद फेंकने पर कोड चलाने के लिए कैसे?
इसे तीन प्रश्नों में विभाजित करें। (1) फेंकने के बाद विधि में से कोई भी कोड निष्पादित किया जाएगा? हाँ। यदि अपवाद एक कोशिश के अंदर था तो मिलान पकड़ने वाले ब्लॉक या अंत में ब्लॉक के अंदर कोड निष्पादित किया जाएगा। यदि कोई कोशिश ब्लॉक नहीं है तो नहीं। अंततः निकटतम संलग्नक में शाखाओं को नियंत्रित करें, पकड़ें या (vb में) अपवाद फ़िल्टर स्टैक को अवरुद्ध करें। –
(2) क्या मुझे फेंकने के बाद ब्रेक देना है? नहीं, ऐसा कभी नहीं करें। फेंक कथन का अंतिम बिंदु पहुंच योग्य नहीं है; एक फेंक को कंपाइलर द्वारा गेटो के रूप में माना जाता है। फेंकने के तुरंत बाद एक बयान पहुंच योग्य नहीं है और कभी निष्पादित नहीं होगा। –
(3) क्या फेंक हमेशा विधि को छोड़ देता है? नहीं। यदि फेंक एक कोशिश में है और कोशिश में मिलान करने वाला पकड़ ब्लॉक है तो पकड़ ब्लॉक अपवाद "खा सकता है"। केवल अगर कोई पकड़ ब्लॉक नहीं है तो अपवाद एक गैर-स्थानीय कॉलो स्टैक को प्राप्त करता है। –