रूबी 1.9 अपवाद पदानुक्रम इस प्रकार है:
Exception
+- NoMemoryError
+- ScriptError
| +- LoadError
| +- NotImplementedError
| +- SyntaxError
+- SignalException
| +- Interrupt
+- StandardError
| +- ArgumentError
| +- IOError
| | +- EOFError
| +- IndexError
| +- LocalJumpError
| +- NameError
| | +- NoMethodError
| +- RangeError
| | +- FloatDomainError
| +- RegexpError
| +- RuntimeError
| +- SecurityError
| +- SystemCallError
| +- SystemStackError
| +- ThreadError
| +- TypeError
| +- ZeroDivisionError
+- SystemExit
+- fatal
रूबी 2 अपवाद पदानुक्रम है: आप के रूप में
Exception
+- NoMemoryError
+- ScriptError
| +- LoadError
| +- NotImplementedError
| +- SyntaxError
+- SecurityError
+- SignalException
| +- Interrupt
+- StandardError # default for rescue
| +- ArgumentError
| | +- UncaughtThrowError
| +- EncodingError
| +- FiberError
| +- IOError
| | +- EOFError
| +- IndexError
| | +- KeyError
| | +- StopIteration
| +- LocalJumpError
| +- NameError
| | +- NoMethodError
| +- RangeError
| | +- FloatDomainError
| +- RegexpError
| +- RuntimeError # default for raise
| +- SystemCallError
| | +- Errno::*
| +- ThreadError
| +- TypeError
| +- ZeroDivisionError
+- SystemExit
+- SystemStackError
+- fatal # impossible to rescue
आप इनमें से किसी एक का उपयोग कर सकते हैं, या अपना खुद का बना। अपना खुद का निर्माण करते समय, कुछ चीजें ध्यान देने योग्य हैं। एक के लिए, rescue
डिफ़ॉल्ट रूप से केवल StandardError
और इसके वंशजों को बचाता है। मुझे यह सब बड़ी कठिनाईयों का सामना करने के बाद मिला है। यह सुनिश्चित करना सबसे अच्छा है कि आपकी कस्टम त्रुटियां StandardError
से प्राप्त हों। (वैसे, किसी भी अपवाद को बचाने के लिए, स्पष्ट रूप से rescue Exception
का उपयोग करें।)
आप एक अपवाद वर्ग गुण, कस्टम कंस्ट्रक्टर्स, आदि के साथ पूरा बना सकते हैं, लेकिन मानक अभ्यास सिर्फ सरल परिभाषाओं बनाने के लिए है:
class ProcessingError < RuntimeError; end
आप अलग-अलग त्रुटि संदेशों के साथ विशिष्ट त्रुटियों को अलग कर सकते हैं, या त्रुटियों का पदानुक्रम बना सकते हैं। विस्तृत अपवाद पदानुक्रम आम तौर पर नहीं किया जाता है, या कम से कम मैंने इसका एक उदाहरण नहीं देखा है (और मैं पुस्तकालयों के स्रोत को पढ़ता हूं)। मैंने जो देखा है वह आपकी त्रुटियों को नाम देने के लिए मॉड्यूल का उपयोग है, जो मुझे लगता है कि एक अच्छा विचार है।
module MyLibrary
class Error < StandardError; end
class ConnectionError < Error; end
end
फिर अपने अपवाद रूप MyLibrary::ConnectionError
का होगा और आप rescue MyLibrary::Error
कर सकते हैं विशेष रूप से अपने पुस्तकालय से त्रुटियों को बचाने और उन सब को पकड़ने के लिए।
नोट: एक वैकल्पिक वाक्यविन्यास MyError = Class.new(RuntimeError)
स्टीव क्लाबनिक के ब्लॉग पोस्ट के संदर्भ को देखें।
संदर्भ:
एक शानदार पढ़ा: Exceptional Ruby Avdi ग्रिम
संबंधित प्रश्न: [रूबी में सही अपवाद उपclass का उपयोग करना] (http://stackoverflow.com/questions/699372/using-the-right-exception-subclass-in-ruby) –
एंड्रयू, धन्यवाद, मुझे वह याद आया । – harald