Python уроки виключення (exceptions), PyNSK - сайт про Python

У цьому уроці ви дізнаєтеся про важливий засіб мови, без якого велика програма не може обійтися. Йтиметься про винятки. Що це таке, як ними користуватися та як створювати власні?

Виняткові ситуації чи винятки (exceptions) - це помилки, виявлені під час виконання. Наприклад, до чого приведе спроба читання неіснуючого файлу? Або якщо файл був випадково видалений, поки програма працювала? Такі ситуації обробляються з допомогою винятків.

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

Загалом винятки необхідні, щоб повідомляти програмісту про помилки.

Найпростіший приклад виключення - поділ на нуль:

В даному випадку інтерпретатор повідомив нам про виключення ZeroDivisionError - поділ на нуль.

У великій програмі винятки часто виникають усередині. Щоб спростити програмісту розуміння помилки та причини такої поведінки, Python пропонує Traceback або в сленгу - трейс. Кожен виняток містить коротку інформацію, але при цьому повну інформацію про місце появи помилки. По трейсу знайти та виправити помилку стає простіше.

Розглянемо такий приклад:

У цьому прикладі чітко видно, який шлях виконання програми. Дивимося знизу вгору і по кроках розумінням, як ми докотилися до такого винятку.

У цьому прикладі при спробі скласти ціле число і рядок ми отримуємо виняток TypeError. В описі відразу ж стає зрозуміло, що ми не так написали.

Приведення рядка до цілого числа призводить до виключення ValueError.

У трейсі цих двох прикладів можна прочитати, що в такому файлі на такому рядку є помилки.

На цьому список вбудованих винятків не закінчується, у наступному розділі розглянуто основні винятки та причини їх виникнення.

Ієрархія винятків

Виняток, якого ви не побачите під час виконання коду - це BaseException - базовий виняток, від якого беруть початок інші.

У ієрархії винятків дві основні групи:

  • Системні винятки та помилки
  • Звичайні винятки

Якщо обробку перших краще не робити (якщо й робити, то треба чітко розуміти для чого), то обробку другої цілком і повністю Python покладає на плечі програміста.

До системних можна сміливо віднести:

  • SystemExit – виняток, що породжується функцією sys.exit при виході з програми.
  • KeyboardInterrupt - виникає під час переривання програми користувачем (зазвичай поєднанням клавіш Ctrl+C).
  • GeneratorExit - виникає при виклику методу close об'єкта generator.

Інші винятки це "звичайні". Спектр уже готових винятків є великим.

Для Python2 ієрархію винятків можна так:

Список винятків покриває великий обсяг ситуацій та помилок програміста. Якщо попередження (warning) лише просять звернути увагу, то помилки можуть зупинити виконання програми.

У Python3 з'явилися нові винятки та ієрархія стала такою:

Загалом помітно, що під час створення Python3 доданий блок нових винятків. Але навіть цих майже 70 винятків не вистачає при написанні програм Python.

Використання винятків

Ми розглянули, що таке винятки, які вони бувають і як їх аналізувати. Але досі явно не розглянули такої важливої ​​речі, як їх використання.

Почнемо з обробки.

Обробка винятків

Давайте розглянемо випадок із розподілом на 0.

Цей код призведе до виключення ZeroDivisionError. Щоб цього не трапилося, скористаємося конструкцією try.except, наприклад так:

Якщо виконати цей код, на консоль буде виведено рядок "integer division or modulo by zero". Здавалося б, що нічого це нам не дало, помилка все також є. Однак у блок except можна помістити обробку.

Наприклад, ми домовилися, що значення змінної c у разі помилки поділу дорівнює -1. Тоді модифікуємо код:

Перед тим, як йти далі, розглянемо ще одну можливість.

Нехай у нас файл із даними у файловій системі і необхідно його прочитати. В цьому випадку відразу ж спливають кілька виняткових ситуацій, такі як: немає файлу, файл битий; файл порожній (за завданням знаємо, що у ньому дані) та інші.

Використовуючи винятки, можна ось так вирішити це завдання:

У цьому вигаданому коді новий хід - перехоплення кількох видів винятків. Коли виняток кинуто, він порівнюється зверху вниз з кожним типом, доки знайдено збіг. Якщо збігу немає, то виняток піде нагору по ланцюжку виконання коду.

Якщо обробка для різних типів винятків однакова, то зменшити кількість коду стає проблемою:

Виклик винятків

Працюючи з винятками програміст витрачає більшу частину часу на обробку, але при цьому виникають ситуації, коли винятками треба кидати в інших.

На сленгу програмістів "кинути виняток" означає написати код, який ініціюватиме виняткову ситуацію.

Наприклад, функція, яка розв'язує квадратне рівняння. Ви домовилися, що коріння тільки речове, тоді у разі комплексного коріння варто кинути виняток.

Щобкинути виняток необхідно скористатисяraise

де IOError це клас виключення.

Якщо при обробці виключення ви хочете прокинути його ще вище, слід написати такий код:

Власні винятки

При написанні власних програм розумне бажання додати виразності коду, а також звернути інших програмістів на особливі виняткові ситуації. Для вирішення цього завдання варто використати власні винятки.

У мінімальному виконанні необхідно успадковуватись від якогось класу в ієрархії винятків. Наприклад так:

Тоді можна залишити свій виняток:

Легко помітити, що ми створюємо клас, а значить все, що ми знаємо про класи справедливо і для винятків. Можна завести змінні та робити їхню обробку. Як правило, винятки – це дуже маленькі класи. Вони мають виконуватися максимально швидко.

Додаток: Повна форма try..except

Форма try. except не повна, повною ж є try..except..else..finaly.

Застосування повної конструкції може помітно спростити код, а також зробити безпечнішим. Уявімо, що в програмі відбувається читання файлу і необхідно переконатися, що об'єкт файлу був коректно закритий і що не було жодного винятку. Цього можна досягти із застосуванням блоку finally.

Іншими словами, finally виконує блок інструкцій у будь-якому випадку, чи був виняток, чи ні. А інструкція else виконується у тому випадку, якщо винятку не було.

Загалом використання повної форми таке:

В уроці розглянуто питання, пов'язані з винятками:

  • Що таке виняток
  • Які типи винятків є у мові
  • Як обробляти винятки
  • Як викликати винятки
  • Як створювати власнівинятки
Дата 2016-01-29 17:32:30 Категорії Python уроки , Уроки Python , Навчальні матеріали Теги