Python hibakezelés: próbálja meg / kivéve / else / végre 2026-ban
A hibakezelés elválasztja a „gépen működő kódot” a „gyártást túlélő kódtól”-tól. A Python try / kivéve egyszerűnek tűnik, de a négy kulcsszóból álló teljes forma – `try / kivéve / else / Végül – meglepően sok struktúrát kódol, amelyet a legtöbb oktatóanyag kihagy.
Ez az útmutató a következőket tárgyalja: mit jelentenek az egyes kulcsszavak, a hat mintát, amelyeket minden háttérkódbázisban látni fog, mikor kell meghatározni a saját kivételeket, és a három anti-mintázatot, amelyek segítségével a hibák átcsúszhatnak a teszteken.
Pontosan a négy kulcsszó
Az "else" záradékot nem használják fel. Azt írja ki, hogy "a következő lépés a próbálkozás sikerességétől függ, de nem akarom, hogy ugyanazzal védje, kivéve". Ez a megfelelő hely a boldog út folytatásához – a „try” szóba helyezve véletlenül a „hajó(eredmény)” nem kapcsolódó kivételeket kapja.
A hat minta
1. Próbálja újra átmeneti hiba esetén
Szabály: CSAK tranziens hibák esetén próbálkozzon újra (hálózat, időtúllépés, 429, 503). Soha ne próbálja újra a "ValueError", "KeyError", "TypeError" hibákat – ezek kódhibák, és az újrapróbálkozás csak háromszor futtatja a hibát.
2. Őrizd a mást
Az „else” garantálja, hogy a „file” sikeresen megnyílt, ÉS a „with” paraméterrel kiterjed a tisztítást. Figyelmeztetés: a process() ValueError-t okozhat – ez továbbterjed, és NEM fogja elkapni a kivéve FileNotFoundError.
3. Tisztítás a "végre" kifejezéssel (mielőtt a "with" létezett)
A modern kódban a with db.connect()-t használnád conn:-ként – a with' a `try / Végül' cukrot jelenti az általános tisztítási esethez. Csak akkor érje el az explicit "végre" kifejezést, ha az erőforrás nem támogatja a környezetkezelő protokollt.
4. Újraemelés hozzáadott kontextussal
A raise NewException(...) from e az eredeti kivételt az újba láncolja, így a visszakövetés MINDENKÉT mutat. Soha ne írja be a "raise NewException(str(e))" szót – ez elveti az eredeti visszakövetést.
5. Fogja meg a lehető legszűkebb kivételt
Szabály: minél szűkebb a kivétel, annál jobb. Ha nem tudja, hogy mit emelhet ki a process, futtassa le, és derítse ki. kivéve kivétel: az esetek 90%-ában kódszag.
6. emelés belül kivéve — tisztán újraemelni
A csupasz "emelés" érintetlenül tartja az eredeti nyomkövetést. Soha ne emeld fel az e-t (a Python 3 okos hozzá, de a csupasz 'emelés' az idiomatikus forma).
Egyéni kivételek – amikor megéri
Határozza meg saját kivételosztályát, amikor:
1. A hívóknak konkrétan "kivéve a MyError:"-t (vagyis hívható API-val kell rendelkezniük, és a felhasználóknak a hiba típusa szerint kell elágazniuk).
2. Könyvtára/szolgáltatása több kapcsolódó hibát is felvet, amelyek megosztják a kontextust.
Mostantól a hívók széles körben ("kivéve PaymentError") vagy szűken ("CardDeclinedError kivételével") elkaphatják. A kivétel strukturált attribútumai (e.card_last4) lehetővé teszik a hibakezelők számára, hogy a kivételüzenetek elemzése nélkül hasznos felhasználói élményt építsenek fel.
Anti-minta: egyéni kivétel meghatározása, amely csak egyszer létezik, és soha nem fogható. Ez csak „ValueError("...") emelése. Az egyéni kivételek az elkapott súlyt kapják.
Három anti-minta, amelyek elrejtik a hibákat
Anti-minta 1: Csupasz, kivéve
A csupasz kivéve elkapja azokat a jeleket, amelyeknek ki kell lépniük a programból (Ctrl-C, sys.exit, MemoryError). Soha ne írd ezt. Ha valóban minden nem végzetes kivételt szeretne elkapni, használja az except Exception: -t, amely MÉG túl sokat fog, de legalább tiszteletben tartja a Ctrl-C billentyűkombinációt.
Anti-minta 2: Elnémítás naplózás nélkül
Minden elkapott kivételt vagy kezelni kell (egy adott tartalékkal), vagy naplózni kell. Az "pass" az kivételben egy hiba lassított felvételnél – úgy tűnik, hogy a kód működik, miközben csendben eldobja az adatokat.
3. anti-minta: kivéve Kivétel: minden körül
Probléma: ha a stripe.charge sikeres volt, de a send_receipt sikertelen, akkor az ügyfélnek díjat kell fizetnie, ÉS Ön lenyelte a hibát. A „kivéve” négy különböző hibamódot takar, és nem lehet őket megkülönböztetni.
Javítás: szűkítse a try hatókörét + elágazza a kivételt modulhatár szerint.
Minden próbálkozás EGY műveletet takar. Mindegyik, kivéve, tudja, mit kell tenni EZZEL a konkrét kudarccal. Ez a gyártási szintű hibakezelés.
A jó hibakezelés inkább tervezés, mint szintaxis. A `try / kivéve / else / végül' megadja az eszközöket; a fegyelem a megfelelő kiválasztása a típus kivételével, a lehető legszűkebb próbálkozási hatókör, és soha nem hallgatja el azokat a hibákat, amelyeket nem ért.
Következő lépés: a Foundations track 10 leckét tartalmaz a kivételkezelésről, az egyéni kivételekről és a "with" utasításról – valódi Python futtatásával a böngészőben.