__repr__ для исключения производный класс не работает хорошо - PullRequest
1 голос
/ 08 января 2020

Я пытался использовать метод __repr__ для объекта, который наследуется от Exception.

, но ничего не печаталось!

Может кто-нибудь помочь объяснить, почему?

class MyException(Exception):
    def __repr__(self):
        return "MyException Object"


try:
    raise MyException()
except MyException as e:
    print(e)   # shows nothing!

1 Ответ

3 голосов
/ 08 января 2020

Поскольку MyException наследует Exception.__str__, к чему впервые обращается print (потому что неявный вызов - str(e), который внутренне возвращается к __repr__, если __str__ нет существовать.

Любопытно, что Exception.__str__ возвращает пустую строку:

>>> str(Exception())
''

Я полагаю, что поэкспериментируя с этим, он возвращает все, что передано Excpetion в качестве аргумента

>>> str(Exception(1))
'1'
>>> str(Exception(None))
'None'
>>> str(Exception(None, True))
'(None, True)'

Итак, переопределите __str__. Или, что еще лучше, в дополнение к:

class MyException(Exception):
    def __repr__(self):
        return "MyException Object"
    __str__ = __repr__
...