İnternethaber.com "Modern Python'da özel istisnalar bildirmenin uygun yolu var mı?"
İstisneniz gerçekten daha spesifik bir istisna türü değilse, bu iyidir:
class MyException(Exception):
pass
Veya daha iyi (belki de mükemmel), pass
bir doktora vermek yerine :
class MyException(Exception):
"""Raise for my specific kind of exception"""
Alt Sınıf İstisna Alt Sınıfları
Gönderen docs
Exception
Tüm yerleşik, sistemden çıkmayan istisnalar bu sınıftan türetilir. Kullanıcı tanımlı tüm istisnalar da bu sınıftan türetilmelidir.
Bunun anlamı şu , eğer istisna bir daha spesifik bir istisna tipi, yerine jenerik bir istisna olduğu alt sınıfıdır Exception
(hala kaynaklandığını ve sonuç olacak Exception
dokümanlar tavsiye gibi). Ayrıca, en azından bir doktora sağlayabilir (ve pass
anahtar kelimeyi kullanmak zorunda kalmazsınız ):
class MyAppValueError(ValueError):
'''Raise when my specific value is wrong'''
Kendinizi bir özel ile oluşturduğunuz özellikleri ayarlayın __init__
. Bir dikteyi konumsal bir argüman olarak iletmekten kaçının, kodunuzun gelecekteki kullanıcıları size teşekkür edecektir. Kullanımdan kaldırılmış ileti özniteliğini kullanırsanız, kendiniz atamanız aşağıdakilerden kaçınacaktır 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)
Kendinizinkini yazmaya gerek yok __str__
ya da __repr__
. Yerleşik olanlar çok güzel ve kooperatif mirasınız onu kullanmanızı sağlar.
En iyi cevabın eleştirisi
Belki soruyu kaçırdım, ama neden olmasın:
class MyException(Exception):
pass
Yine, yukarıdaki sorun, onu yakalamak için, onu özel olarak adlandırmanız (başka bir yerde oluşturulmuşsa içe aktarma) veya İstisna'yı yakalamanız gerekmesidir (ancak muhtemelen her türlü İstisna türünü ele almaya hazır değilseniz, ve yalnızca ele almaya hazır olduğunuz istisnaları yakalamanız gerekir). Aşağıda benzer eleştiri, fakat buna ek olarak en değil yolu üzerinden başlatmak için olduğunu super
ve bir alırsınız DeprecationWarning
ileti özelliğini erişmek eğer:
Düzenleme: bir şeyi geçersiz kılmak (veya fazladan değişkenler iletmek) için şunu yapın:
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
Bu şekilde hata mesajlarının diksiyonunu ikinci parametreye aktarabilir ve daha sonra e.errors ile alabilirsiniz.
Ayrıca, tam olarak iki argümanın iletilmesini (. Dışında self
) gerektirir Daha fazla, daha az değil. Bu, gelecekteki kullanıcıların takdir edemeyeceği ilginç bir kısıtlamadır.
Doğrudan olmak - Liskov'un ikame edilebilirliğini ihlal ediyor .
Her iki hatayı da göstereceğim:
>>> 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'
Nazaran:
>>> MyAppValueError('foo', 'FOO', 'bar').message
'foo'