Перейти до основного вмісту
Основи Python2026-07-29 · 9 хв читання

Обробка помилок Python: спробуйте / крім / else / нарешті в 2026 році

Обробка помилок відокремлює «код, який працює на вашій машині» від «коду, який виживає у виробництві». спробувати/за винятком у Python виглядає просто, але повна форма з чотирьох ключових слів — спробувати/за винятком/ще / нарешті — кодує дивовижну кількість структури, яку пропускає більшість посібників.

Цей посібник охоплює: що насправді означає кожне ключове слово, шість шаблонів, які ви побачите в кожній базовій кодовій базі, коли визначати власні винятки, і три антишаблони, які дозволяють помилкам пройти повз ваші тести.

Чотири ключові слова, точно

▶ PYTHONeditable · runs in your browser

Речення else використовується недостатньо. У ньому сказано: "цей наступний біт залежить від успіху спроби, але я не хочу, щоб він був захищений тим самим, за винятком". Це правильне місце для продовження щасливого шляху — розміщення його всередині 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 — це поширюватиметься вгору, а НЕ буде перехоплено except 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

Голе raise зберігає вихідне трасування недоторканим. Ніколи не raise e (Python 3 розумний щодо цього, але голе raise є ідіоматичною формою).

Спеціальні винятки — коли воно того варте

Визначте власний клас винятків, коли:

1. Викликачі мають окрім MyError: спеціально (тобто, у вас є API, що викликається, і користувачі повинні розгалужуватися за типом помилки).

2. Ваша бібліотека/служба викликає кілька пов’язаних помилок, які мають спільний контекст.

▶ PYTHONeditable · runs in your browser

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

Антишаблон: визначення спеціального винятку, який існує лише для того, щоб викликати його один раз і ніколи не перехоплювати. Це просто raise ValueError("..."). Користувальницькі винятки отримують свою вагу від того, що їх зловлюють.

Три антишаблони, які приховують помилки

Антишаблон 1: Голий за винятком

▶ PYTHONeditable · runs in your browser

Голий 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

Кожна спроба охоплює ОДНУ операцію. Кожен крім знає, що робити з ЦІЄЮ конкретною помилкою. Це обробка помилок виробничого рівня.


Хороша обробка помилок — це більше дизайн, ніж синтаксис. try / osim / else / finally дає вам інструменти; Дисципліна полягає у виборі правильного типу, за винятком, якнайвужчого можливого діапазону спроб і ніколи не замовчує помилки, які ви не розумієте.

Наступний крок: Трек 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.