все 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Сообщить о неточности