`बढ़ाएँ” foo ”और` बढ़ाएँ अपवाद.new (“foo”) `के बीच क्या अंतर है?


जवाबों:


121

तकनीकी रूप से, पहला सेट करने के लिए संदेश के साथ एक 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। बाकी सब कुछ विशिष्ट होना चाहिए।


2
बहुत जानकारीपूर्ण, धन्यवाद। कुछ चीजें: [1] वह अंतिम पैराग्राफ सबसे रोशन था, और मुझे irb में कुछ ऐसी चीजों की खोज करने दें, जिनका आपने उल्लेख नहीं किया है: RuntimeError < StandardError < Exception[२] इसलिए, कोड का दूसरा ब्लॉक एक अपवाद और एक RuntimeError [३] दोनों को पकड़ लेगा। यह दिलचस्प / अजीब है कि उस विशेष अपवाद के साथ काम करने के लिए "नंगे" उठना और बचाव होता है [4] शायद अंगूठे का नियम क्लाइंट कोड के लिए RuntimeError को उठाना है, लेकिन अपने स्वयं के कोड के अंदर अपने स्वयं के कस्टम अपवाद को उठाना और बचाव करना है?
जॉन बाकिर

1
[१, २] हां। [३] निश्चित नहीं है ... [४] जब मैं अपने सबसे अधिक पेशेवर पर कोडिंग कर रहा होता हूं, तो मुझे कस्टम त्रुटि प्रकार बनाने की प्रवृत्ति होती है जो मुझे विरासत में मिलती है StandardError। यह कुछ लाइनों की तरह अधिक जटिल होना जरूरी नहीं है class MissingArgumentsError < StandardError; end
डैनियल ल्यूक्राफ्ट

बहुत जानकारीपूर्ण है, लेकिन आप लाइब्रराय लिखने के लिए रन टाइम त्रुटि पसंद करते हैं, तो आप रन टाइम टाइम एरर के बजाय एसेसेप्शन को कैसे फेंकना चाहेंगे?
चिहुंग यू

35

आधिकारिक दस्तावेज से:

raise   
raise( string )
raise( exception [, string [, array ] ] )

कोई तर्क नहीं होने पर, अपवाद को $!बढ़ा देता है या RuntimeErrorयदि $!शून्य है तो उठाता है । एक Stringतर्क के साथ, यह RuntimeErrorएक संदेश के रूप में स्ट्रिंग के साथ उठता है । अन्यथा, पहला पैरामीटर एक Exceptionवर्ग का नाम होना चाहिए (या एक ऑब्जेक्ट जो एक Exceptionभेजे गए अपवाद को लौटाता है)। वैकल्पिक दूसरा पैरामीटर अपवाद से जुड़े संदेश को सेट करता है, और तीसरा पैरामीटर कॉलबैक जानकारी की एक सरणी है। अपवाद begin...endब्लॉक के बचाव खंड द्वारा पकड़े जाते हैं ।

raise "Failed to create socket"
raise ArgumentError, "No parameters", caller
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.