Python Glossary English

все Python 3Исключенияпонятие

Пользовательские исключения

пользовательские

Создавай классы исключений, наследуясь от Exception. Можно добавлять атрибуты и иерархию.

Синтаксис

class MyError(Exception):
    pass

Наследуйся от Exception, а не от BaseException: от BaseException идут KeyboardInterrupt и SystemExit, и случайно попасть в их семейство — значит сломать Ctrl+C и штатный выход. Полезно завести один базовый класс на модуль или приложение, а от него уже частные ошибки: тогда вызывающий код одним except ловит всё семейство, но при желании может отреагировать и на конкретный подкласс. Аргументы конструктора сами попадают в args и в текст str(e), поэтому ради одного сообщения свой __init__ писать не нужно.

Примеры

class AppError(Exception):
    pass
class DatabaseError(AppError):
    pass
class NetworkError(AppError):
    pass
try:
    raise DatabaseError('Connection failed')
except AppError as e:
    print(type(e).__name__, e)  # → DatabaseError Connection failed
class ValidationError(ValueError):
    def __init__(self, field, message):
        self.field = field
        super().__init__(f'{field}: {message}')
try:
    raise ValidationError('email', 'invalid format')
except ValidationError as e:
    print(e.field, e)  # → email email: invalid format
class HttpError(Exception):
    def __init__(self, status_code, message):
        self.status_code = status_code
        super().__init__(f'HTTP {status_code}: {message}')
class NotFoundError(HttpError):
    def __init__(self, url):
        super().__init__(404, f'{url} not found')
try:
    raise NotFoundError('/api/users')
except HttpError as e:
    print(e.status_code, e)  # → 404 HTTP 404: /api/users not found
# Иерархия ошибок
class PaymentError(Exception): pass
class InsufficientFundsError(PaymentError):
    def __init__(self, amount, balance):
        self.shortage = amount - balance
        super().__init__(f'Need {self.shortage} more')
try:
    raise InsufficientFundsError(100, 60)
except InsufficientFundsError as e:
    print(e, e.shortage)  # → Need 40 more 40
# raise ... from
class ServiceError(Exception): pass
try:
    try:
        int('abc')
    except ValueError as e:
        raise ServiceError('Parse failed') from e
except ServiceError as e:
    print(e)                    # → Parse failed
    print(type(e.__cause__))   # → <class 'ValueError'>
# repr дефолтный
class SimpleError(Exception):
    pass
e = SimpleError('something went wrong')
print(str(e))   # → something went wrong
print(repr(e))  # → SimpleError('something went wrong')

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности