रूबी के दो अलग-अलग अपवाद तंत्र हैं: थ्रो / कैच और रेज / रेस्क्यू।
हमारे पास दो क्यों हैं?
आपको एक का उपयोग कब करना चाहिए और दूसरे का नहीं?
रूबी के दो अलग-अलग अपवाद तंत्र हैं: थ्रो / कैच और रेज / रेस्क्यू।
हमारे पास दो क्यों हैं?
आपको एक का उपयोग कब करना चाहिए और दूसरे का नहीं?
जवाबों:
मुझे लगता है कि http://hasno.info/ruby-gotchas-and-caveats में अंतर का एक अच्छा स्पष्टीकरण है:
कैच / थ्रो उठाना / रेस्क्यू के समान नहीं है। कैच / थ्रो आपको ब्लॉक को एक बिंदु पर जल्दी से बाहर निकलने की अनुमति देता है जहां एक कैच को एक विशिष्ट प्रतीक के लिए परिभाषित किया गया है, बचाव को बढ़ाएं अपवाद वस्तु को शामिल करने वाला वास्तविक अपवाद हैंडलिंग सामान है।
raise
बहुत महंगा है। throw
नहीं है। एक लूप से बाहर निकलने के लिए throw
उपयोग goto
करने के बारे में सोचें ।
raise
, fail
, rescue
, और ensure
संभाल त्रुटियों , भी रूप में जाना जाता अपवादthrow
और catch
हैं नियंत्रण प्रवाहअन्य भाषाओं के विपरीत, रूबी के थ्रो और कैच अपवादों के लिए उपयोग नहीं किए जाते हैं। इसके बजाय, वे निष्पादन को जल्दी समाप्त करने का एक तरीका प्रदान करते हैं जब कोई और काम करने की आवश्यकता नहीं होती है। (ग्रिम, 2011)
नियंत्रण के प्रवाह के एक स्तर को समाप्त करना, एक while
लूप की तरह , एक सरल के साथ किया जा सकता है return
। एक नेस्टेड लूप की तरह, नियंत्रण प्रवाह के कई स्तरों को समाप्त किया जा सकता है throw
।
हालांकि जब उठाने और बचाव का अपवाद तंत्र निष्पादन को छोड़ देता है, जब चीजें गलत हो जाती हैं, तो कभी-कभी सामान्य प्रसंस्करण के दौरान कुछ गहरी नेस्टेड निर्माण से बाहर निकलने में सक्षम होना अच्छा होता है। यह वह जगह है जहाँ पकड़ और फेंक काम में आते हैं। (थॉमस एंड हंट, 2001)
https://coderwall.com/p/lhkkug/don-t-confuse-ruby-s-throw-statement-with-raise एक उत्कृष्ट विवरण प्रस्तुत करता है, मुझे संदेह है कि मैं इसमें सुधार कर सकता हूं। जैसा कि मैंने जाना, ब्लॉग पोस्ट से कुछ कोड नमूनों को संक्षेप में प्रस्तुत करना:
raise
/ आप / अन्य भाषाओं (या पायथन / / ) से परिचित हैं / निर्माण rescue
के निकटतम एनालॉग हैं । यदि आपको कोई त्रुटि स्थिति आई है और आप इसे किसी अन्य भाषा में समाप्त कर देंगे , तो आपको रूबी में होना चाहिए ।throw
catch
raise
except
throw
raise
रूबी throw
/ catch
आपको निष्पादन को तोड़ने और एक catch
(जैसे raise
/ rescue
करता है) की तलाश में ऊपर चढ़ने देता है , लेकिन वास्तव में त्रुटि स्थितियों के लिए नहीं है। इसका उपयोग शायद ही कभी किया जाना चाहिए, और जब "संगत स्टैक को तब तक चलना है जब तक आप एक संबंधित catch
" व्यवहार नहीं पाते हैं तब तक के लिए एक एल्गोरिथ्म आप लिख रहे हैं के लिए समझ में आता है, लेकिन यह throw
एक त्रुटि के अनुसार के बारे में सोचने का मतलब नहीं होगा स्थिति।
रूबी में पकड़ने और फेंकने के लिए क्या उपयोग किया जाता है? throw
/ catch
निर्माण के अच्छे उपयोग पर कुछ सुझाव प्रदान करता है ।
उनके बीच ठोस व्यवहार अंतर में शामिल हैं:
rescue Foo
के Foo
उपवर्गों सहित बचाव उदाहरणों को प्रस्तुत करेगा Foo
। catch(foo)
केवल पकड़ेगा एक ही वस्तु, Foo
। न केवल आप catch
इसके उदाहरणों को पकड़ने के लिए एक वर्ग नाम पारित नहीं कर सकते हैं , बल्कि यह समानता तुलना भी नहीं करेगा। उदाहरण के लिए
catch("foo") do
throw "foo"
end
आपको 2.2 से पहले UncaughtThrowError: uncaught throw "foo"
(या ArgumentError
रूबी के संस्करणों में) देगा
एकाधिक बचाव खंड सूचीबद्ध किए जा सकते हैं ...
begin
do_something_error_prone
rescue AParticularKindOfError
# Insert heroism here.
rescue
write_to_error_log
raise
end
जबकि कई catch
es को नेस्टेड होने की आवश्यकता है ...
catch :foo do
catch :bar do
do_something_that_can_throw_foo_or_bar
end
end
एक नंगे rescue
के बराबर है rescue StandardError
और एक मुहावरेदार निर्माण है। एक "नंगे catch
", जैसे catch() {throw :foo}
, कभी भी कुछ भी नहीं पकड़ेगा और इसका उपयोग नहीं किया जाना चाहिए।
goto
में सी / सी ++ @docwhat रूप में उल्लेख किया गया है, जावा है ब्रेक लेबल और जारी रखने के लिए । (पाइथन के पास इसके लिए एक अस्वीकृत प्रस्ताव भी है ।)