Дефинирани от потребителя изключения в Python с примери
Дефинираните от потребителя изключения се създават чрез дефиниране на нов клас, който наследява от Вградено изключение на Python клас или един от неговите подкласове. Правейки това, можем да създаваме персонализирани съобщения за грешки и да обработваме конкретни грешки по начин, който има смисъл за нашето приложение.
Стъпки за създаване и използване на дефинирани от потребителя изключения
Следвайте тези стъпки, за да създадете и използвате дефинирани от потребителя изключения в Python:
- Дефинирайте нов клас изключения: Създайте нов клас, който наследява Exception или някой от неговите подкласове.
- Повишете изключението: Използвайте израза за повишаване, за да повдигнете дефинираното от потребителя изключение, когато възникне конкретно условие.
- Обработка на изключението: Използвайте блокове try-except за обработка на дефинираното от потребителя изключение.
Пример: В този пример създаваме персонализирано изключение InvalidAgeError, за да гарантираме, че стойностите на възрастта попадат в валиден диапазон (0–120).
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
Обяснение:
- 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 улавя грешката и отпечатва форматираното съобщение.
Кога да се използват дефинирани от потребителя изключения?
Дефинираните от потребителя изключения трябва да се вземат предвид в следните сценарии:
- Представяне на конкретни грешки в приложение (напр. InvalidAgeError DatabaseConnectionError).
- Предоставяне на по-ясни и по-описателни съобщения за грешка.
- Обработване на група от свързани грешки отделно с помощта на изключение.
Чрез използване на дефинирани от потребителя изключения програмите стават по-четими, поддържани и по-лесни за отстраняване на грешки.
Предложен тест Редактиране на тест 3 въпросаКакво се случва, ако дефинирано от потребителя изключение наследи от RuntimeError вместо от Exception?
- А
Не може да бъде уловен с помощта на освен
- б
Става непроверено изключение
- В
От манипулаторите се третира като грешка, свързана с времето на изпълнение
- г
Той губи персонализирани атрибути
Наследяването от RuntimeError позволява да се обработва като грешка по време на изпълнение, както и персонализирана.
Защо super().__init__(self.msg) често се използва в персонализирани класове за изключения?
- А
За предотвратяване на множествено наследяване
- б
За правилно инициализиране на базовия клас Exception
- В
За да отмените обратното проследяване
- г
За автоматично повдигане на изключението
Извикването на super() гарантира, че основното изключение е правилно инициализирано със съобщението.
Какво ще се отпечата, ако персонализирано изключение замени __str__() и се отпечата вътре освен?
- А
Отмененото представяне на низ
- б
Адрес на паметта на изключението
- В
Само името на класа
- г
Нищо, освен ако не се използва repr().
print(e) извиква __str__() на обекта за изключение.
Тестът е завършен успешно Вашият резултат: 2 /3 Точност: 0% Влезте, за да видите обяснението 1 /3 1 /3 < Previous Следващ >