Към основното съдържание
Основи на Python2026-07-29 · 9 мин четене

Обработка на грешки в Python: опитайте / освен / иначе / накрая през 2026 г

Обработката на грешки разделя „кода, който работи на вашата машина“ от „кода, който оцелява при производството“. „Опитайте / освен“ на Python изглежда просто, но пълната форма с четири ключови думи – „опитайте / освен / друго / накрая“ – кодира изненадващо много структура, която повечето уроци пропускат.

Това ръководство обхваща: какво всъщност означава всяка ключова дума, шестте модела, които ще видите във всяка кодова база от задния край, кога да дефинирате свои собствени изключения и трите анти-модели, които позволяват грешките да се подминат покрай вашите тестове.

Точно четирите ключови думи

▶ PYTHONeditable · runs in your browser

Клаузата „друго“ се използва недостатъчно. Казва "този следващ бит зависи от успешния опит, но не искам да бъде защитен от същото, освен". Това е правилното място за продължението на щастливия път — поставянето му вътре в try случайно улавя несвързани изключения от ship(result).

Шестте модела

1. Опитайте отново при преходна грешка

▶ PYTHONeditable · runs in your browser

Правило: опитайте отново САМО при преходни грешки (мрежа, изчакване, 429, 503). Никога не опитвайте повторно при ValueError, KeyError, TypeError — това са грешки в кода и повторният опит просто стартира грешката три пъти.

2. Защитете с else

▶ PYTHONeditable · runs in your browser

else гарантира, че file е отворен успешно И включва почистване на обхвати с with. Забележка: process() може да предизвика ValueError — това ще се разпространи нагоре, НЯМА да бъде уловено от освен FileNotFoundError.

3. Почистване с finally (преди with да съществува)

▶ PYTHONeditable · runs in your browser

В съвременния код бихте използвали with db.connect() като conn: — with е захарта пред try / finally за обичайния случай на почистване. Посягайте към изрично „накрая“ само когато ресурсът не поддържа протокола за управление на контекста.

4. Повторно повдигане с добавен контекст

▶ PYTHONeditable · runs in your browser

raise NewException(...) from e свързва оригиналното изключение към новото, така че проследяването показва И ДВЕТЕ. Никога не пишете raise NewException(str(e)) — това отхвърля оригиналното проследяване.

5. Хванете възможно най-малкото изключение

▶ PYTHONeditable · runs in your browser

Правило: колкото по-тясно е изключение, толкова по-добре. Ако не знаете какъв процес може да предизвика, стартирайте го и разберете. except Exception: е кодова миризма в 90% от времето.

6. raise вътре в except — ри-рейз чисто

▶ PYTHONeditable · runs in your browser

Bare raise запазва оригиналното проследяване непокътнато. Никога не raise e (Python 3 е умен за това, но голото raise е идиоматичната форма).

Персонализирани изключения — когато си заслужава

Дефинирайте свой собствен клас изключение, когато:

1. Обаждащите се трябва специално да освен MyError: (т.е. имате извикващ API и потребителите трябва да се разклоняват според типа грешка).

2. Вашата библиотека/услуга предизвиква множество свързани грешки, които споделят контекст.

▶ PYTHONeditable · runs in your browser

Сега обаждащите се могат да улавят широко (с изключение на PaymentError) или тясно (с изключение на CardDeclinedError). Структурираните атрибути на изключението (e.card_last4) позволяват на манипулаторите на грешки да изграждат полезен потребителски интерфейс, без да анализират съобщения за изключение.

Анти-модел: дефиниране на персонализирано изключение, което съществува само за да бъде повдигнато веднъж и никога да не бъде уловено. Това е просто повдигнете ValueError("..."). Персонализираните изключения печелят своята тежест от това да бъдат хванати.

Три анти-модели, които крият грешки

Анти-модел 1: Голо с изключение

▶ PYTHONeditable · runs in your browser

Bare except улавя сигнали, които трябва да излязат от програмата (Ctrl-C, sys.exit, MemoryError). Никога не пишете това. Ако наистина искате да улавяте всяко нефатално изключение, използвайте except Exception: — което ВСЕ ПАК хваща твърде много, но поне зачита Ctrl-C.

Анти-модел 2: Заглушаване без регистриране

▶ PYTHONeditable · runs in your browser

Всяко уловено изключение трябва или да се обработи (с конкретен резервен вариант), или да се регистрира. pass в изключение е грешка при забавен каданс — кодът изглежда работи, докато безшумно отхвърля данни.

▶ PYTHONeditable · runs in your browser

Анти-модел 3: освен Изключение: около всичко

▶ PYTHONeditable · runs in your browser

Проблем: ако stripe.charge е успешен, но send_receipt е неуспешен, клиентът е бил таксуван И вие сте преглътнали грешката. „Изключението“ обхваща четири различни режима на повреда и не можете да ги различите.

Коригиране: стеснете пробния обхват + разклонете освен по граница на модул.

▶ PYTHONeditable · runs in your browser

Всеки опит обхваща ЕДНА операция. Всеки освен знае какво да прави с ТОЗИ конкретен провал. Това е обработка на грешки от производствен клас.


Доброто обработване на грешки е повече дизайн, отколкото синтаксис. опитайте / освен / иначе / накрая ви дава инструментите; дисциплината е избирането на правилния с изключение на типа, възможно най-тесния обхват на опита и никога заглушаването на грешки, които не разбирате.

Следваща стъпка: Track Foundations има 10 урока за обработка на изключения, персонализирани изключения и израза with — с истински Python, работещ във вашия браузър.

Готови ли сте да опитате?

15 безплатни уроци след безплатна регистрация — без карта. Изпробвайте платформата и след това решете.

Започнете безплатно →

Or unlock every lesson

Pro — $12/mo, unlimited AI, cancel any time. Refund within 14 days worldwide.

See Pro plans →

Get one Python lesson + one career idea every Friday

No spam, no "buy our course now". Three bullets, every Friday. Unsubscribe with one click.