"आधुनिक पायथन में कस्टम अपवाद घोषित करने का उचित तरीका?"
यह ठीक है, जब तक कि आपका अपवाद वास्तव में अधिक विशिष्ट अपवाद का एक प्रकार न हो:
class MyException(Exception):
pass
या बेहतर (शायद एकदम सही), pass
डॉकस्ट्रिंग देने के बजाय :
class MyException(Exception):
"""Raise for my specific kind of exception"""
सबक्लासिंग अपवाद उपवर्ग
से डॉक्स
Exception
सभी अंतर्निहित, गैर-सिस्टम-एक्साइटिंग अपवाद इस वर्ग से प्राप्त होते हैं। सभी उपयोगकर्ता-परिभाषित अपवाद भी इसी वर्ग से प्राप्त होने चाहिए।
इसका मतलब यह है कि यदि आपका अपवाद एक अधिक विशिष्ट अपवाद है, तो सामान्य के बजाय उस अपवाद को उप-वर्ग बनाएं Exception
(और इसका परिणाम यह होगा कि आप अभी भी Exception
डॉक्स सलाह के अनुसार प्राप्त करेंगे)। इसके अलावा, आप कम से कम एक डॉकस्ट्रिंग प्रदान कर सकते हैं (और pass
कीवर्ड का उपयोग करने के लिए मजबूर नहीं होना चाहिए ):
class MyAppValueError(ValueError):
'''Raise when my specific value is wrong'''
सेट विशेषताएँ आप एक कस्टम के साथ खुद को बनाते हैं __init__
। एक तानाशाही तर्क के रूप में पारित करने से बचें, आपके कोड के भविष्य के उपयोगकर्ता आपको धन्यवाद देंगे। यदि आप पदावनत संदेश विशेषता का उपयोग करते हैं, तो इसे स्वयं निर्दिष्ट करने से आप बच जाएंगे DeprecationWarning
:
class MyAppValueError(ValueError):
'''Raise when a specific subset of values in context of app is wrong'''
def __init__(self, message, foo, *args):
self.message = message # without this you may get DeprecationWarning
# Special attribute you desire with your Error,
# perhaps the value that caused the error?:
self.foo = foo
# allow users initialize misc. arguments as any other builtin Error
super(MyAppValueError, self).__init__(message, foo, *args)
वास्तव में अपनी खुद की __str__
या लिखने की कोई आवश्यकता नहीं है __repr__
। बिल्टइन बहुत अच्छे हैं, और आपकी सहकारी विरासत सुनिश्चित करती है कि आप इसका उपयोग करते हैं।
शीर्ष उत्तर का आलोचक
शायद मैं इस सवाल से चूक गया, लेकिन क्यों नहीं:
class MyException(Exception):
pass
फिर, ऊपर के साथ समस्या यह है कि इसे पकड़ने के लिए, आपको या तो इसे विशेष रूप से नाम देना होगा (यदि इसे कहीं और बनाया गया है) और आपको केवल उन अपवादों को पकड़ना चाहिए जिन्हें आप संभालने के लिए तैयार हैं)। इसी तरह की आलोचना नीचे करने के लिए है, लेकिन इसके अलावा इसके माध्यम से शुरू करने का तरीका नहीं है super
, और DeprecationWarning
यदि आप संदेश विशेषता का उपयोग करते हैं , तो आपको मिलेगा :
संपादित करें: कुछ को ओवरराइड करने के लिए (या अतिरिक्त आर्गन्स पास करें), ऐसा करें:
class ValidationError(Exception):
def __init__(self, message, errors):
# Call the base class constructor with the parameters it needs
super(ValidationError, self).__init__(message)
# Now for your custom code...
self.errors = errors
इस तरह से आप त्रुटि संदेश के दूसरे पैरामाम को पास कर सकते हैं, और इसे बाद में ई.ओर्स के साथ प्राप्त कर सकते हैं
इसमें (दो तरफ से self
) पास होने के लिए वास्तव में दो तर्कों की आवश्यकता होती है । यह एक दिलचस्प बाधा है कि भविष्य के उपयोगकर्ता सराहना नहीं कर सकते हैं।
प्रत्यक्ष होने के लिए - यह लिस्कोव प्रतिस्थापन क्षमता का उल्लंघन करता है ।
मैं दोनों त्रुटियों को प्रदर्शित करूँगा:
>>> ValidationError('foo', 'bar', 'baz').message
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
ValidationError('foo', 'bar', 'baz').message
TypeError: __init__() takes exactly 3 arguments (4 given)
>>> ValidationError('foo', 'bar').message
__main__:1: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
'foo'
की तुलना में:
>>> MyAppValueError('foo', 'FOO', 'bar').message
'foo'