Rukovanje pogreškama u Pythonu: pokušaj / osim / inače / konačno u 2026
Rukovanje pogreškama odvaja "kod koji radi na vašem stroju" od "koda koji preživljava proizvodnju". Pythonov pokušaj / osim izgleda jednostavno, ali puni oblik od četiri ključne riječi — pokušaj / osim / inače / konačno — kodira iznenađujuću količinu strukture koju većina tutorijala preskače.
Ovaj vodič pokriva: što svaka ključna riječ zapravo znači, šest uzoraka koje ćete vidjeti u svakoj pozadinskoj bazi koda, kada definirati vlastite iznimke i tri anti-obrasca koji dopuštaju bugovima da prođu pored vaših testova.
Točno četiri ključne riječi
Klauzula "else" se premalo koristi. Kaže "ovaj sljedeći dio ovisi o uspjehu pokušaja, ali ne želim da bude zaštićen istim osim". To je pravo mjesto za nastavak sretnog puta — stavljanje unutar pokušati slučajno hvata nepovezane iznimke iz ship(result).
Šest uzoraka
1. Pokušaj ponovno u slučaju prolaznog kvara
Pravilo: pokušajte ponovno SAMO na prolaznim pogreškama (mreža, vremensko ograničenje, 429, 503). Nikada ne pokušavajte ponovo na ValueError, KeyError, TypeError — to su greške koda, a ponovni pokušaj samo pokreće pogrešku tri puta.
2. Zaštitite s else
else jamči da je datoteka uspješno otvorena I obuhvaća čišćenje opsega pomoću with. Napomena: process() može pokrenuti ValueError — to će se proširiti prema gore, NEĆE ga uhvatiti osim FileNotFoundError.
3. Čišćenje pomoću "konačno" (prije nego što je postojao "sa")
U modernom kodu upotrijebili biste with db.connect() kao conn: — with je šećer nad try / finally za uobičajeni slučaj čišćenja. Posegnite za eksplicitnim "konačno" samo kada resurs ne podržava protokol upravitelja konteksta.
4. Ponovno podizanje s dodanim kontekstom
raise NewException(...) from e ulančava izvornu iznimku na novu tako da povratno praćenje prikazuje OBA. Nikada nemojte pisati raise NewException(str(e)) — to odbacuje izvorno praćenje.
5. Uhvatite najužu iznimku koju možete
Pravilo: što je izuzetak uži, to bolje. Ako ne znate što proces može pokrenuti, pokrenite ga i saznajte. osim iznimke: je šifrirani miris 90% vremena.
6. raise unutar except — čisto ponovno podizanje
Bare raise zadržava izvorno praćenje netaknutim. Nikada nemojte raise e (Python 3 je pametan u vezi s tim, ali golo raise je idiomatski oblik).
Prilagođene iznimke — kada se isplati
Definirajte vlastitu klasu izuzetaka kada:
1. Pozivatelji trebaju posebno osim MyError: (tj. imate API koji se može pozivati i korisnici se moraju granati prema vrsti greške).
2. Vaša biblioteka/usluga javlja višestruke povezane pogreške koje dijele kontekst.
Sada pozivatelji mogu uhvatiti široko (osim PaymentError) ili usko (osim CardDeclinedError). Strukturirani atributi na iznimci (e.card_last4) omogućuju rukovateljima pogreškama izgradnju korisnog korisničkog sučelja bez analiziranja poruka o iznimkama.
Anti-uzorak: definiranje prilagođene iznimke koja postoji samo da bi se pokrenula jednom i nikada nije uhvaćena. To je samo raise ValueError("..."). Prilagođene iznimke dobivaju svoju težinu time što su uhvaćene.
Tri anti-uzorka koji skrivaju greške
Anti-uzorak 1: Golo osim
Goli except hvata signale koji bi trebali izaći iz programa (Ctrl-C, sys.exit, MemoryError). Nikad ovo nemoj napisati. Ako doista želite uhvatiti svaku nefatalnu iznimku, koristite except Exception: — koja IPAK hvata previše, ali barem poštuje Ctrl-C.
Anti-uzorak 2: Utišavanje bez zapisivanja
Svaku uhvaćenu iznimku treba ili obraditi (s određenim zamjenskim rješenjem) ili zabilježiti. pass u osim je bug u usporenom snimku — čini se da kôd radi dok tiho odbacuje podatke.
Anti-uzorak 3: osim iznimke: oko svega
Problem: ako je stripe.charge uspio, ali send_receipt nije uspio, kupcu je naplaćeno I vi ste progutali pogrešku. Osim pokriva četiri različita načina kvara i ne možete ih razlikovati.
Popravak: suzite opseg pokušaja + granajte osim po granici modula.
Svaki pokušaj pokriva JEDNU operaciju. Svaki osim zna što učiniti u vezi OVOG specifičnog kvara. To je rukovanje pogreškama proizvodne razine.
Dobro rukovanje pogreškama je više dizajn nego sintaksa. pokušaj / osim / inače / konačno daje vam alate; disciplina je odabir pravog osim tipa, najuži mogući opseg pokušaja i nikad prešućivanje pogrešaka koje ne razumijete.
Sljedeći korak: Traka temelja ima 10 lekcija o rukovanju iznimkama, prilagođenim iznimkama i naredbi with — sa pravim Pythonom koji radi u vašem pregledniku.