"Правильный" способ определения исключения в Python без запроса PyLint
Я пытаюсь определить свой собственный (очень простой) класс исключений в Python 2.6, но независимо от того, как я это делаю, я получаю предупреждение.
Во-первых, самый простой способ:
class MyException(Exception):
pass
Это работает, но выводит предупреждение во время выполнения: DeprecationWarning: BaseException.message устарел от Python 2.6 Хорошо, так что это не так. Затем я попытался:
class MyException(Exception):
def __init__(self, message):
self.message = message
Это также работает, но PyLint сообщает предупреждение: W0231: MyException.__init__: __init__ method from base class 'Exception' is not called
. Поэтому я попробовал называть его:
class MyException(Exception):
def __init__(self, message):
super(Exception, self).__init__(message)
self.message = message
Это тоже работает! Но теперь PyLint сообщает об ошибке: E1003: MyException.__init__: Bad first argument 'Exception' given to super class
Как, черт возьми, я делаю такую простую вещь без каких-либо предупреждений?
Ответы
Ответ 1
Когда вы вызываете super
, вам нужен класс подкласса/производного в качестве первого аргумента, а не основной/базовый класс.
Из онлайн-документации Python:
class C(B):
def method(self, arg):
super(C, self).method(arg)
Итак, ваше исключение будет определено следующим образом:
class MyException(Exception):
def __init__(self, message):
super(MyException, self).__init__(message)
self.message = message
Ответ 2
Хорошо, я думаю, что понял это. Это, похоже, радует PyLint:
class MyException(Exception):
def __init__(self, message):
Exception.__init__(self, message)
self.message = message
Ответ 3
Ваш первый способ должен работать. Я использую его сам все время в Python 2.6.5. Однако я не использую атрибут "сообщение"; возможно, поэтому в первом примере вы получаете предупреждение о запуске.
Следующий код, например, запускается без каких-либо ошибок или предупреждений во время выполнения:
class MyException(Exception):
pass
def thrower():
error_value = 3
raise MyException("My message", error_value)
return 4
def catcher():
try:
print thrower()
except MyException as (message, error_value):
print message, "error value:", error_value
Результат:
>>> catcher()
My message error value: 3
Я не знаю, будет ли проблема с PyLint проблемой выше.