जवाबों:
तकनीकी रूप से, पहला सेट करने के लिए संदेश के साथ एक RuntimeError उठाता है "foo"
, और दूसरा संदेश के साथ एक अपवाद उठाता है "foo"
।
व्यावहारिक रूप से, जब आप पूर्व का उपयोग करना चाहते हैं और जब आप बाद का उपयोग करना चाहते हैं, के बीच एक महत्वपूर्ण अंतर है।
सीधे शब्दों में कहें, आप शायद एक RuntimeError
नहीं चाहते हैं Exception
। एक तर्क के बिना एक बचाव ब्लॉक पकड़ लेगा RuntimeErrors
, लेकिन Exception
एस नहीं पकड़ेगा । इसलिए यदि आप Exception
अपने कोड में एक बढ़ाते हैं , तो यह कोड इसे नहीं पकड़ेगा:
begin
rescue
end
आदेश पकड़ने के लिए Exception
आप इस करना होगा:
begin
rescue Exception
end
इसका मतलब यह है कि एक अर्थ में, Exception
एक "से भी बदतर" एक त्रुटि है RuntimeError
, क्योंकि आपको इससे उबरने के लिए अधिक काम करना होगा।
तो जो आप चाहते हैं वह इस बात पर निर्भर करता है कि आपका प्रोजेक्ट अपनी त्रुटि को कैसे संभालता है। उदाहरण के लिए, हमारे डेमों में, मुख्य लूप में एक रिक्त बचाव होता है जो RuntimeErrors
उन्हें पकड़ लेगा , रिपोर्ट करेगा और फिर जारी रखेगा। लेकिन एक या दो परिस्थितियों में, हम चाहते हैं कि डेमॉन वास्तव में एक त्रुटि पर मर जाए, और उस मामले में हम एक बढ़ाते हैं Exception
, जो सीधे हमारे "सामान्य त्रुटि हैंडलिंग कोड" के माध्यम से और बाहर जाता है।
और फिर, यदि आप लाइब्रेरी कोड लिख रहे हैं, तो आप शायद ए चाहते हैं RuntimeError
, ए नहीं Exception
, क्योंकि आपकी लाइब्रेरी के उपयोगकर्ता आश्चर्यचकित होंगे यदि यह त्रुटियां उठाता है कि एक खाली rescue
ब्लॉक नहीं पकड़ सकता है, और यह उन्हें महसूस करने में एक पल लगेगा क्यों।
अंत में, मुझे यह कहना चाहिए कि यह RuntimeError
वर्ग का एक उपवर्ग है StandardError
, और वास्तविक नियम यह है कि यद्यपि आप raise
किसी भी प्रकार की वस्तु को देख सकते हैं , लेकिन रिक्त rescue
केवल डिफ़ॉल्ट रूप से कुछ भी पकड़ सकता है जो विरासत में मिला है StandardError
। बाकी सब कुछ विशिष्ट होना चाहिए।
StandardError
। यह कुछ लाइनों की तरह अधिक जटिल होना जरूरी नहीं है class MissingArgumentsError < StandardError; end
।
raise
raise( string )
raise( exception [, string [, array ] ] )
कोई तर्क नहीं होने पर, अपवाद को $!
बढ़ा देता है या RuntimeError
यदि $!
शून्य है तो उठाता है । एक String
तर्क के साथ, यह RuntimeError
एक संदेश के रूप में स्ट्रिंग के साथ उठता है । अन्यथा, पहला पैरामीटर एक Exception
वर्ग का नाम होना चाहिए (या एक ऑब्जेक्ट जो एक Exception
भेजे गए अपवाद को लौटाता है)। वैकल्पिक दूसरा पैरामीटर अपवाद से जुड़े संदेश को सेट करता है, और तीसरा पैरामीटर कॉलबैक जानकारी की एक सरणी है। अपवाद begin...end
ब्लॉक के बचाव खंड द्वारा पकड़े जाते हैं ।
raise "Failed to create socket"
raise ArgumentError, "No parameters", caller
RuntimeError < StandardError < Exception
[२] इसलिए, कोड का दूसरा ब्लॉक एक अपवाद और एक RuntimeError [३] दोनों को पकड़ लेगा। यह दिलचस्प / अजीब है कि उस विशेष अपवाद के साथ काम करने के लिए "नंगे" उठना और बचाव होता है [4] शायद अंगूठे का नियम क्लाइंट कोड के लिए RuntimeError को उठाना है, लेकिन अपने स्वयं के कोड के अंदर अपने स्वयं के कस्टम अपवाद को उठाना और बचाव करना है?