Я обычно объявляю базовое исключение для моих модулей, которое ничего не делает, из этого я извлекаю пользовательские ошибки, которые могут иметь дополнительные пользовательские данные: AFAIK, это правильный путь для использования исключений в Python.
Я также привык создавать удобочитаемое сообщение из этой пользовательской информации и передавать его, чтобы я мог ссылаться на это сообщение в обработчиках ошибок. Это пример:
# this code is meant to be compatible with Python-2.7.x
class MycoolmoduleException(Exception):
'''base Mycoolmodule Exception'''
class TooManyFoo(MycoolmoduleException):
'''got too many Foo things'''
def __init__(self, foo_num):
self.foo_num = foo_num
msg = "someone passed me %d Foos" % foo_num
super(TooManyFoo, self).__init__(msg)
# .... somewhere else ....
try:
do_something()
except Exception as exc:
tell_user(exc.message)
# real world example using Click
@click.command()
@click.pass_context
def foo(ctx):
'''do something'''
try:
# ... try really hard to do something useful ...
except MycoolmoduleException as exc:
click.echo(exc.message, err=True)
ctx.exit(-1)
Теперь, когда я запускаю этот код через pylint-2.3.1
, он жалуется на мое использование MycoolmoduleException.message
:
coolmodule.py:458:19: E1101: Instance of 'MycoolmoduleException' has no 'message' member (no-member)
Такой код всегда работал для меня (как в Python2, так и в Python3), и hasattr(exc, 'message')
в одном и том же коде возвращает True
, так почему же Pylint жалуется? И / или: как улучшить этот код?
(Примечание: то же самое происходит, если я пытаюсь поймать встроенный Exception
вместо своего MycoolmoduleException
)