"නූතන පයිතන් හි අභිරුචි ව්යතිරේක ප්රකාශ කිරීමට නිසි ක්රමයක් තිබේද?"
ඔබේ ව්යතිරේකය සැබවින්ම වඩා සුවිශේෂී ව්යතිරේක වර්ගයක් නොවේ නම් මෙය හොඳයි:
class MyException(Exception):
pass
හෝ වඩා හොඳ (සමහර විට පරිපූර්ණ), pass
ලේඛ ලේඛනයක් ලබා දෙනවා වෙනුවට :
class MyException(Exception):
"""Raise for my specific kind of exception"""
උප පංති ව්යතිරේක උප පංති
සිට ලේඛන
Exception
සියලු සාදන ලද, පද්ධති නොවන පිටවීමේ ව්යතිරේකයන් මෙම පන්තියෙන් ව්යුත්පන්න කර ඇත. පරිශීලක අර්ථ දක්වන ලද සියලුම ව්යතිරේකයන් ද මෙම පන්තියෙන් ලබා ගත යුතුය.
මාර්ගයෙන් බව නම් ඔබේ හැර ඒ වෙනුවට Generic බලපත්රය යටතේ අවසර ලබා ඇත පිළිබඳ වඩාත් විශේෂිත හැර, උපපංතිය බව හැර වර්ගයකි 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
එමඟින් ඔබට දෙවන පරාමිතිය වෙත වැරදි පණිවිඩ යැවිය හැකි අතර පසුව එය e.errors සමඟ ලබා ගත හැකිය
ඒ සඳහා හරියටම තර්ක දෙකක් ඉදිරිපත් කිරීම අවශ්ය වේ self
. එය අනාගත පරිශීලකයින් අගය නොකරන සිත්ගන්නා සුළු බාධකයකි.
සෘජු වීමට - එය ලිස්කොව් ආදේශන හැකියාව උල්ලං lates නය කරයි .
මම දෝෂ දෙකම නිරූපණය කරමි:
>>> 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'
There should be one-- and preferably only one --obvious way to do it.