Виняток — це несподівана ситуація, яка відбувається під час виконання програми. Наприклад:
|
1 |
divide_by_zero = 7 / 0 |
Цей рядок згенерує виняток, тому що ділити на 0 не можна.
Логічні помилки (винятки) в Python
Помилки, що виникають під час виконання програми (після проходження синтаксичної перевірки), називаються винятками або логічними помилками.
Наприклад, вони виникають, коли ми:
намагаємося відкрити неіснуючий файл — генерується виняток FileNotFoundError;
намагаємося ділити на нуль — генерується виняток ZeroDivisionError;
намагаємося імпортувати неіснуючий модуль — генерується виняток ImportError.
При виникненні подібних помилок під час виконання Python створює об’єкт винятку.
Якщо помилка не була оброблена належним чином, виводиться інформація про цю помилку разом з подробицями, чому вона сталася.
Подивимося, як Python обробляє подібні помилки:
|
1 2 |
divide_numbers = 7 / 0 print(divide_numbers) |
Результат:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ZeroDivisionError: division by zero
Тут, під час спроби виконання операції 7 / 0, програма генерує виняток ZeroDivisionError.
Вбудовані винятки в Python
Некоректні операції можуть генерувати винятки. У Python існує багато вбудованих винятків, які генеруються при виникненні відповідних помилок.
Ми можемо переглянути всі вбудовані винятки за допомогою функції local() наступним чином:
|
1 |
print(dir(locals()['__builtins__'])) |
Тут locals()['__builtins__'] поверне модуль вбудованих винятків, функцій та атрибутів, а dir дозволить перерахувати ці атрибути у вигляді рядків.
Нижче наведено деякі з найбільш поширених вбудованих винятків в Python, а також помилки, які їх викликають:
| Виняток | Причина |
| AssertionError | Виникає, коли оператор assert не спрацьовує. |
| AttributeError | Виникає при помилці присвоєння атрибута чи посилання. |
| EOFError | Виникає, коли функція input() досягає стану кінця файлу. |
| FloatingPointError | Виникає при збої операції з даними типу з плаваючою крапкою. |
| ImportError | Виникає, якщо імпортований модуль не знайдено. |
| IndexError | Виникає, коли зазначений індекс у послідовності виходить за межі допустимого діапазону. |
| KeyError | Виникає, коли ключ не знайдено у словнику. |
| KeyboardInterrupt | Виникає, коли користувач натискає клавішу переривання (Ctrl+C або Delete). |
| MemoryError | Виникає, коли закінчується пам’ять для виконання операції. |
| NameError | Виникає, коли змінна не знайдена у локальній чи глобальній області видимості. |
| NotImplementedError | Виникає під час використання абстрактних методів. |
| OSError | Виникає, коли робота системи викликає помилку, пов’язану із системою. |
| OverflowError | Виникає, коли результат арифметичної операції дуже великий для представлення. |
| RuntimeError | Виникає, коли помилка не підпадає під жодну іншу категорію. |
| StopIteration | Викликається функцією next(), щоб вказати, що немає наступного елемента, який має бути повернутий ітератором. |
| SyntaxError | Викликається синтаксичним парсером при виявленні синтаксичної помилки. |
| IndentationError | Виникає при неправильному відступі. |
| TabError | Виникає, коли відступ складається з непослідовних табуляцій та пробілів. |
| SystemError | Виникає, коли інтерпретатор виявляє внутрішню помилку. |
| SystemExit | Викликається функцією sys.exit(). |
| TypeError | Виникає, коли функція або операція застосовується до об’єкта неправильного типу. |
| UnboundLocalError | Виникає, коли у функції або методі робиться посилання на локальну змінну, але значення не було прив’язане до цієї змінної. |
| UnicodeError | Виникає при виникненні помилки кодування або декодування, пов’язаної з Unicode. |
| UnicodeEncodeError | Виникає, коли під час кодування відбувається помилка, пов’язана з Unicode. |
| UnicodeDecodeError | Виникає, коли під час декодування відбувається помилка, пов’язана з Unicode. |
| UnicodeTranslateError | Виникає під час помилки, пов’язаної з Unicode, коли відбувається переклад. |
| ValueError | Виникає, коли функція отримує аргумент правильного типу, але некоректне значення (для цього типу). |
| ZeroDivisionError | Виникає, коли другий операнд операції ділення або модуляції дорівнює нулю. |
У разі потреби ми також можемо визначити власні винятки. Для роботи з винятками у Python використовуються оператори try, except та finally.
Помилки та винятки в Python
Помилками зазвичай є помилки компіляції, синтаксичні помилки, помилки у логічній частині коду, несумісність бібліотек, нескінченна рекурсія тощо.
Винятки можуть бути спіймані та оброблені програмою.
