logo

Дефинирани от потребителя изключения в Python с примери

Дефинираните от потребителя изключения се създават чрез дефиниране на нов клас, който наследява от Вградено изключение на Python клас или един от неговите подкласове. Правейки това, можем да създаваме персонализирани съобщения за грешки и да обработваме конкретни грешки по начин, който има смисъл за нашето приложение.

Стъпки за създаване и използване на дефинирани от потребителя изключения

Следвайте тези стъпки, за да създадете и използвате дефинирани от потребителя изключения в Python:



  • Дефинирайте нов клас изключения: Създайте нов клас, който наследява Exception или някой от неговите подкласове.
  • Повдигнете изключението: Използвайте израза за повишаване, за да повдигнете дефинираното от потребителя изключение, когато възникне конкретно условие.
  • Обработка на изключението: Използвайте блокове try-except за обработка на дефинираното от потребителя изключение.

Пример: В този пример създаваме персонализирано изключение InvalidAgeError, за да гарантираме, че стойностите на възрастта попадат в валиден диапазон (0–120).

зададен в java
Python
# Step 1: Define a custom exception class class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120'): self.age = age self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.age} -> {self.msg}' # Step 2: Use the custom exception in your code def set_age(age): if age < 0 or age > 120: raise InvalidAgeError(age) else: print(f'Age set to: {age}') # Step 3: Handling the custom exception try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e) 

Изход
150 -> Age must be between 0 and 120 

Обяснение:

  • Класът InvalidAgeError наследява от Exception. То определя ан __горещо__ метод за приемане на възраст и съобщение.
  • Методът __str__ връща четимо низово представяне на грешката.
  • В set_age(), ако възрастта е извън валидния диапазон (0–120), се повдига изключение.
  • Блокът try-except улавя изключението и отпечатва съобщението за грешка.

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

Когато създаваме персонализирано изключение, ние подкласираме вградения клас Exception на Python (или подклас като ValueError TypeError и т.н.). След това можем да добавим наши собствени методи за атрибути или персонализирана логика, за да направим нашето изключение по-информативно.



Можем също така да подобрим персонализираните изключения чрез добавяне на допълнителни атрибути или заместващи методи.

Пример: Тук подобряваме InvalidAgeError, като добавяме код за грешка и персонализираме съобщението за грешка.

Python
class InvalidAgeError(Exception): def __init__(self age msg='Age must be between 0 and 120' error_code=1001): self.age = age self.msg = msg self.error_code = error_code super().__init__(self.msg) def __str__(self): return f'[Error Code {self.error_code}] {self.age} -> {self.msg}' try: set_age(150) # This will raise the custom exception except InvalidAgeError as e: print(e) 

Изход
[Error Code 1001] 150 -> Age must be between 0 and 120 

Обяснение:



рекурсия в java
  • InvalidAgeError вече има допълнителен атрибут error_code.
  • Методът __str__ се отменя, за да показва както кода на грешката, така и възрастта.
  • Когато се изпълни set_age(150), изключението се повдига и прихваща в блока try-except.
  • Персонализираното съобщение за грешка се отпечатва, което прави грешката по-описателна.

Използване на стандартни изключения като основен клас

Понякога вместо директно наследяване от Exception можем да създадем персонализирано изключение чрез подкласиране на стандартно изключение като RuntimeError ValueError и т.н. Това е полезно, когато вашето персонализирано изключение трябва да се третира като специфичен вид грешка.

Пример: Този пример показва как да създадете персонализирано изключение NetworkError чрез наследяване от RuntimeError, което е стандартно вградено изключение.

Python
# NetworkError has base RuntimeError and not Exception class NetworkError(RuntimeError): def __init__(self arg): self.args = (arg) # store as tuple try: raise NetworkError('Connection failed') except NetworkError as e: print(e.args) 

Изход
('Connection failed') 

Обяснение:

  • NetworkError наследява от RuntimeError, който е вграден тип изключение.
  • Когато е повдигнато, съобщението се съхранява в атрибута args като кортеж.
  • Изключението се улавя и неговите съхранени аргументи се показват.

Пример от реалния свят: Грешка при невалиден имейл

Ето прост пример, при който създаваме персонализирано изключение, ако имейл адресът не е валиден:

Python
class InvalidEmailError(Exception): def __init__(self email msg='Invalid email format'): self.email = email self.msg = msg super().__init__(self.msg) def __str__(self): return f'{self.email} -> {self.msg}' def set_email(email): if '@' not in email: raise InvalidEmailError(email) print(f'Email set to: {email}') try: set_email('userexample.com') except InvalidEmailError as e: print(e) 

Изход
userexample.com -> Invalid email format 

Обяснение:

  • Дефиниран е нов клас изключения InvalidEmailError за валидиране на имейл адреси.
  • Ако даденият имейл не съдържа '@', възниква изключение.
  • Блокът try-except улавя грешката и отпечатва форматираното съобщение.

Кога да се използват дефинирани от потребителя изключения?

Дефинираните от потребителя изключения трябва да се вземат предвид в следните сценарии:

подравнете изображението с css
  • Представяне на конкретни грешки в приложение (напр. InvalidAgeError DatabaseConnectionError).
  • Предоставяне на по-ясни и по-описателни съобщения за грешка.
  • Обработване на група от свързани грешки отделно с помощта на изключение.

Чрез използване на дефинирани от потребителя изключения програмите стават по-четими, поддържани и по-лесни за отстраняване на грешки.