Исключения — это мощный и изящный способ обработки ошибок в ваших программах Python. Пользовательские исключения выводят эту возможность на новый уровень.
Встроенные классы исключений Python не устраняют определенные ошибки, которые могут возникнуть в вашем коде. В таких случаях вам потребуется создать собственные исключения для эффективной обработки этих ошибок.
В Python вы можете определять собственные исключения и вызывать их при возникновении определенных ошибок. Вы можете управлять конкретными информативными ошибками с помощью пользовательских исключений, улучшая читаемость и удобство обслуживания вашего кода.
Зачем вам нужны пользовательские исключения?
Во время разработки приложения могут возникнуть различные сценарии ошибок из-за изменений в коде, интеграции с другими пакетами или библиотеками, а также взаимодействия с внешними приложениями. Крайне важно обрабатывать эти ошибки, чтобы восстанавливаться после них или корректно обрабатывать сбои.
Python предлагает широкий спектр встроенное исключение
классы, которые охватывают такие ошибки, как ValueError, ТипОшибка, Филенотфаундеррор, и более. Хотя эти встроенные исключения хорошо служат своей цели, они лишь иногда могут точно отображать ошибки, которые могут возникнуть в вашем приложении.Создавая собственные исключения, вы можете адаптировать их специально под требования вашего приложения и предоставить информацию разработчикам, использующим ваш код.
Как определить пользовательские исключения
Чтобы создать собственные исключения, определить класс Python который наследует от Класс исключения. Исключение Класс предлагает базовые функции, необходимые для обработки исключений, и вы можете настроить его, добавляя функции в соответствии с вашими конкретными потребностями.
При создании пользовательских классов исключений сохраняйте их простоту, включая необходимые атрибуты для хранения информации об ошибках. Обработчики исключений могут затем получить доступ к этим атрибутам для соответствующей обработки ошибок.
Вот собственный класс исключений, MyCustomError:
classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)
Этот класс принимает необязательный аргумент сообщения во время инициализации. Он использует супер() метод для вызова конструктора базы Исключение класс, который необходим для обработки исключений.
Как вызвать пользовательские исключения
Чтобы вызвать ошибку, используйте поднимать Ключевое слово, за которым следует экземпляр вашего пользовательского класса исключений, передавая ему сообщение об ошибке в качестве аргумента:
ifTrue:
raise MyCustomError("A Custom Error Was Raised...")
Вы также можете вызвать ошибку без передачи каких-либо аргументов:
ifTrue:
raise MyCustomError # shorthand
Любой формат подходит для возникновения пользовательских ошибок.
Как обрабатывать пользовательские исключения
Обработка пользовательских исключений осуществляется по тому же подходу, что и обработка встроенных исключений. Использовать пытаться, кроме, и окончательно блоки для перехвата пользовательских исключений и принятия соответствующих мер.
try:
print("Hello, You're learning how to MakeUseOf Custom Errors")
raise MyCustomError("Opps, Something Went Wrong...")
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Done Handling Custom Error")
Таким образом, вы можете обрабатывать все формы создаваемых пользовательских исключений.
Если исключение возникает во время выполнения пытаться блок, соответствующий кроме блок может поймать и обработать его. Если нет подходящего кроме блок для обработки исключения, любой окончательно блок выполнится, после чего снова возникнет исключение. Использовать окончательно блокировать в первую очередь для выполнения задач очистки, которые должны выполняться при любых обстоятельствах, независимо от того, возникло исключение или нет.
try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")
В этом образце КлавиатураПрерывание возникает исключение, но кроме блокировать только дескрипторы MyCustomError исключения. В этом случае окончательно блок запускается, а затем снова возникает необработанное исключение.
Наследование пользовательских классов ошибок
На основе концепция объектно-ориентированного программирования (ООП), вы также можете наследовать от пользовательских классов исключений, как и от обычных классов. Наследуя пользовательский класс исключений, вы можете создавать классы ошибок, предоставляющие более конкретный контекст исключению. Такой подход позволяет обрабатывать ошибки на разных уровнях кода и обеспечивает лучшее понимание того, что вызвало ошибку.
Предположим, вы разрабатываете веб-приложение, которое взаимодействует с внешним API. Этот API может иметь разные сценарии ошибок. Вы захотите последовательно и четко обрабатывать эти ошибки во всем своем коде. Для этого создайте собственный класс исключений, BaseAPIException:
classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message
Имея этот базовый пользовательский класс исключений, вы можете создавать дочерние классы исключений, которые наследуются от него:
classAPINotFoundError(BaseAPIException):
Raised when the requested resource is not found in the API.
passclassAPIAuthenticationError(BaseAPIException):
Raised when there's an issue with authentication to the API.
pass
classAPIRateLimitExceeded(BaseAPIException):
Raised when the rate limit for API requests is exceeded.
pass
Вызывайте и перехватывайте эти пользовательские исключения при вызовах API в вашем веб-приложении. Обрабатывайте их соответствующим образом, используя соответствующую логику в своем коде.
defrequest_api():
try:
# Simulate an API error for demonstration purposes
raise APINotFoundError("Requested resource not found.")
except APINotFoundError as err:
# Log or handle the 'Not Found' error case
print(f"API Not Found Error: {err}")
except APIAuthenticationError:
# Take appropriate actions for authentication error
print(f"API Authentication Error: {err}")
except APIRateLimitExceeded:
# Handle the rate limit exceeded scenario
print(f"API Rate Limit Exceeded: {err}")
except BaseAPIException:
# Handle other unknown API exceptions
print(f"Unknown API Exception: {err}")
Последнее предложение, исключающее, проверяет родительский класс и действует как комплексное средство для любых других ошибок, связанных с API.
Наследуя пользовательские классы исключений, вы можете эффективно обрабатывать ошибки в API. Этот подход позволяет вам отделить обработку ошибок от деталей реализации API. упрощает добавление пользовательских исключений или внесение изменений по мере развития API или возникновения новых ошибок. случаи.
Обертывание пользовательских исключений
Обернуть исключения означает перехватить исключение, инкапсулировать его в пользовательское исключение, а затем вызвать это пользовательское исключение, ссылаясь на исходное исключение как на его причину. Этот метод помогает предоставить контекст сообщениям об ошибках и скрывает детали реализации от вызывающего кода.
Рассмотрим сценарий, в котором ваше веб-приложение взаимодействует с API. Если API вызывает Ошибка поиска,можно поймать, потом поднять кастом APINotFoundError исключение, которое ссылается на LookupError как на свою причину:
defrequest_api():
try:
# Simulate an API error for demonstration purposes
# Assuming the external API raised a LookupError
raise LookupError("Sorry, You Encountered A LookUpError !!!")
except LookupError as original_exception:
try:
# Wrap the original exception with a custom exception
raise APINotFoundError \
("Requested resource not found.") from original_exception
except APINotFoundError as wrapped_exception:
# Handle the wrapped exception here
print(f"Caught wrapped API exception: {wrapped_exception}")# or re-raise it if necessary
raise
try:
request_api()
except APINotFoundError as err:
print(f"Caught API exception: {err.__cause__}")
Использовать от пункт с поднимать оператор для ссылки на исходное исключение в вашем пользовательском исключении.
Когда возникает пользовательское исключение, оно включает исходное исключение в качестве __причина__ атрибут, обеспечивающий связь между пользовательским исключением и оригиналом. Это позволяет отслеживать происхождение исключения.
Обертывая исключения, вы можете предоставить более содержательный контекст и отправлять пользователям более подходящие сообщения об ошибках, не раскрывая детали внутренней реализации вашего кода или API. Оно также позволяет структурированно и единообразно управлять типами ошибок и устранять их.
Настройка поведения классов в Python
Наследуя базовый класс исключений, предоставляемый Python, вы можете создавать простые и полезные исключения, которые можно вызывать при возникновении определенных ошибок в вашем коде. Вы также можете реализовать собственное поведение для своих классов исключений с помощью магических методов или методов dunder.