Печать подклассов исключений не является кортежем аргументов - PullRequest
1 голос
/ 10 мая 2019

Для исключений, используемых в проекте:

class SwitcherError(Exception):
    pass


class ApiError(SwitcherError):
   pass



class ApiHTTPError(ApiError):
    def __init__(self, message=None, text=None, api_errors=None):
        self.text = text
        self.message = message
        self.errors = api_errors


class ApiJsonError(ApiError):
    def __init__(self, message=None, text=None):
        super().__init__(message)
        self.text = text

Если я распечатаю ошибку, используя super, я не получаю отпечаток кортежа аргументов (как определено BaseException), ноЯ делаю, если я не использую super () и просто переопределяю аргументы прямо в инициализаторе.Я не понимаю, почему это так и как я должен писать свои классы.

Куда «текст» попал в вывод?

try:
    raise ApiJsonError('msg', 'text')
except ApiJsonError as e:
    print(e)
>>> 'msg'

, где, как показано ниже, как и ожидалось

try:
    raise ApiHTTPError('msg', 'text')
except ApiHTTPError as e:
    print(e)

>>>('msg', 'text')

1 Ответ

1 голос
/ 10 мая 2019

Вы можете переопределить ApiJsonError.__str__:

class ApiJsonError(ApiError):
    def __init__(self, message=None, text=None):
        super().__init__(message)
        self.text = text
    def __str__(self):
        return str((*self.args, self.text))

, который производит:

>>> try:
...     raise ApiJsonError('msg', 'text')
... except ApiJsonError as e:
...     print(e)
... 
('msg', 'text')

Из документов :

except предложение может указывать переменную после имени исключения.Переменная связана с экземпляром исключения с аргументами, хранящимися в instance.args. Для удобства экземпляр исключения определяет __str__(), поэтому аргументы могут быть напечатаны напрямую, без ссылки на .args.

...