Обработка на грешки в Python: опитайте / освен / иначе / накрая през 2026 г
Обработката на грешки разделя „кода, който работи на вашата машина“ от „кода, който оцелява при производството“. „Опитайте / освен“ на Python изглежда просто, но пълната форма с четири ключови думи – „опитайте / освен / друго / накрая“ – кодира изненадващо много структура, която повечето уроци пропускат.
Това ръководство обхваща: какво всъщност означава всяка ключова дума, шестте модела, които ще видите във всяка кодова база от задния край, кога да дефинирате свои собствени изключения и трите анти-модели, които позволяват грешките да се подминат покрай вашите тестове.
Точно четирите ключови думи
Клаузата „друго“ се използва недостатъчно. Казва "този следващ бит зависи от успешния опит, но не искам да бъде защитен от същото, освен". Това е правилното място за продължението на щастливия път — поставянето му вътре в try случайно улавя несвързани изключения от ship(result).
Шестте модела
1. Опитайте отново при преходна грешка
Правило: опитайте отново САМО при преходни грешки (мрежа, изчакване, 429, 503). Никога не опитвайте повторно при ValueError, KeyError, TypeError — това са грешки в кода и повторният опит просто стартира грешката три пъти.
2. Защитете с else
else гарантира, че file е отворен успешно И включва почистване на обхвати с with. Забележка: process() може да предизвика ValueError — това ще се разпространи нагоре, НЯМА да бъде уловено от освен FileNotFoundError.
3. Почистване с finally (преди with да съществува)
В съвременния код бихте използвали with db.connect() като conn: — with е захарта пред try / finally за обичайния случай на почистване. Посягайте към изрично „накрая“ само когато ресурсът не поддържа протокола за управление на контекста.
4. Повторно повдигане с добавен контекст
raise NewException(...) from e свързва оригиналното изключение към новото, така че проследяването показва И ДВЕТЕ. Никога не пишете raise NewException(str(e)) — това отхвърля оригиналното проследяване.
5. Хванете възможно най-малкото изключение
Правило: колкото по-тясно е изключение, толкова по-добре. Ако не знаете какъв процес може да предизвика, стартирайте го и разберете. except Exception: е кодова миризма в 90% от времето.
6. raise вътре в except — ри-рейз чисто
Bare raise запазва оригиналното проследяване непокътнато. Никога не raise e (Python 3 е умен за това, но голото raise е идиоматичната форма).
Персонализирани изключения — когато си заслужава
Дефинирайте свой собствен клас изключение, когато:
1. Обаждащите се трябва специално да освен MyError: (т.е. имате извикващ API и потребителите трябва да се разклоняват според типа грешка).
2. Вашата библиотека/услуга предизвиква множество свързани грешки, които споделят контекст.
Сега обаждащите се могат да улавят широко (с изключение на PaymentError) или тясно (с изключение на CardDeclinedError). Структурираните атрибути на изключението (e.card_last4) позволяват на манипулаторите на грешки да изграждат полезен потребителски интерфейс, без да анализират съобщения за изключение.
Анти-модел: дефиниране на персонализирано изключение, което съществува само за да бъде повдигнато веднъж и никога да не бъде уловено. Това е просто повдигнете ValueError("..."). Персонализираните изключения печелят своята тежест от това да бъдат хванати.
Три анти-модели, които крият грешки
Анти-модел 1: Голо с изключение
Bare except улавя сигнали, които трябва да излязат от програмата (Ctrl-C, sys.exit, MemoryError). Никога не пишете това. Ако наистина искате да улавяте всяко нефатално изключение, използвайте except Exception: — което ВСЕ ПАК хваща твърде много, но поне зачита Ctrl-C.
Анти-модел 2: Заглушаване без регистриране
Всяко уловено изключение трябва или да се обработи (с конкретен резервен вариант), или да се регистрира. pass в изключение е грешка при забавен каданс — кодът изглежда работи, докато безшумно отхвърля данни.
Анти-модел 3: освен Изключение: около всичко
Проблем: ако stripe.charge е успешен, но send_receipt е неуспешен, клиентът е бил таксуван И вие сте преглътнали грешката. „Изключението“ обхваща четири различни режима на повреда и не можете да ги различите.
Коригиране: стеснете пробния обхват + разклонете освен по граница на модул.
Всеки опит обхваща ЕДНА операция. Всеки освен знае какво да прави с ТОЗИ конкретен провал. Това е обработка на грешки от производствен клас.
Доброто обработване на грешки е повече дизайн, отколкото синтаксис. опитайте / освен / иначе / накрая ви дава инструментите; дисциплината е избирането на правилния с изключение на типа, възможно най-тесния обхват на опита и никога заглушаването на грешки, които не разбирате.
Следваща стъпка: Track Foundations има 10 урока за обработка на изключения, персонализирани изключения и израза with — с истински Python, работещ във вашия браузър.