Vartotojo nustatytos išimtys sukuriamos apibrėžiant naują klasę, kuri paveldima iš Python integruota išimtis klasė arba vienas iš jos poklasių. Tai darydami galime sukurti pasirinktinius klaidų pranešimus ir tvarkyti konkrečias klaidas taip, kad tai būtų naudinga mūsų programai.
Vartotojo nustatytų išimčių kūrimo ir naudojimo veiksmai
Norėdami sukurti ir naudoti vartotojo nustatytas išimtis programoje Python, atlikite šiuos veiksmus:
- Apibrėžkite naują išimties klasę: Sukurkite naują klasę, kuri paveldės iš Exception arba bet kurio jos poklasio.
- Padidinkite išimtį: Naudokite kėlimo teiginį, kad padidintumėte vartotojo nustatytą išimtį, kai įvyksta konkreti sąlyga.
- Tvarkykite išimtį: Naudokite try-except blokus, kad galėtumėte apdoroti vartotojo apibrėžtą išimtį.
Pavyzdys: Šiame pavyzdyje sukuriame tinkintą išimtį InvalidAgeError, kad užtikrintume, jog amžiaus reikšmės patenka į tinkamą diapazoną (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)
Išvestis
150 -> Age must be between 0 and 120
Paaiškinimas:
- InvalidAgeError klasė paveldima iš išimties. Jis apibrėžia an __karšta__ būdas priimti amžių ir žinią.
- Metodas __str__ grąžina skaitomą klaidos eilutės vaizdą.
- Jei amžius nepatenka į galiojantį diapazoną (0–120), set_age() išimtis padidinama.
- „Try-except“ blokas užfiksuoja išimtį ir išspausdina klaidos pranešimą.
Išimčių klasių pritaikymas
Kai sukuriame tinkintą išimtį, poklasiuojame Python integruotą išimties klasę (arba poklasį, pvz., ValueError TypeError ir kt.). Tada galime pridėti savo atributų metodus arba pasirinktinę logiką, kad mūsų išimtis būtų informatyvesnė.
Taip pat galime patobulinti pasirinktines išimtis pridėdami papildomų atributų arba nepaisydami metodų.
Pavyzdys: Čia mes patobuliname InvalidAgeError pridėdami klaidos kodą ir tinkindami klaidos pranešimą.
Pythonclass 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)
Išvestis
[Error Code 1001] 150 -> Age must be between 0 and 120
Paaiškinimas:
- InvalidAgeError dabar turi papildomą atributą error_code.
- __str__ metodas nepaisomas, kad būtų rodomas ir klaidos kodas, ir amžius.
- Kai vykdomas set_age(150), išimtis padidinama ir užfiksuojama try-except bloke.
- Pritaikytas klaidos pranešimas išspausdinamas, todėl klaidą apibūdina labiau.
Standartinių išimčių naudojimas kaip bazinė klasė
Kartais užuot paveldėję tiesiogiai iš išimties, galime sukurti pasirinktinę išimtį, suskirstydami standartinę išimtį, pvz., RuntimeError ValueError ir tt Tai naudinga, kai jūsų pasirinkta išimtis turėtų būti traktuojama kaip konkreti klaida.
Pavyzdys: Šiame pavyzdyje parodyta, kaip sukurti tinkintą išimtį NetworkError, paveldint iš RuntimeError, kuri yra standartinė integruota išimtis.
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)
Išvestis
('Connection failed') Paaiškinimas:
- NetworkError paveldi iš RuntimeError, kuris yra įtaisytasis išimties tipas.
- Pakėlus pranešimas išsaugomas atribute args kaip eilutė.
- Išimtis užfiksuojama ir rodomi jos išsaugoti argumentai.
Realus pavyzdys: netinkamo el. pašto klaida
Štai paprastas pavyzdys, kai pateikiame tinkintą išimtį, jei el. pašto adresas negalioja:
Pythonclass 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)
Išvestis
userexample.com -> Invalid email format
Paaiškinimas:
- El. pašto adresams patvirtinti nustatyta nauja išimties klasė InvalidEmailError.
- Jei nurodytame el. laiške nėra „@“, taikoma išimtis.
- „Try-except“ blokas užfiksuoja klaidą ir išspausdina suformatuotą pranešimą.
Kada naudoti vartotojo nustatytas išimtis?
Naudotojo nustatytas išimtis reikėtų atsižvelgti į šiuos scenarijus:
- Nurodomos konkrečios programos klaidos (pvz., InvalidAgeError DatabaseConnectionError).
- Teikti aiškesnius ir labiau aprašomus klaidų pranešimus.
- Susijusių klaidų grupės tvarkymas atskirai naudojant išskyrus.
Naudojant vartotojo nustatytas išimtis, programos tampa lengviau skaitomos, prižiūrimos ir lengviau derinamos.