Помилки
Ніколи не помиляється лише той, хто нічого не робить.
Ви вже не раз стикались з ситуацією, коли запущена ваша програма "викидає помилку" і припиняє свою роботу. Далі розберемось звідки і чому виникають помилки, і що з цим можна зробити.
Винятки
У програмуванні, коли "сталася якась помилка", прийнято казати що "виникла виняткова ситуація". Іншими словами "щось пішло не так, як очікувалось".
В Python, як і в деяких інших мовах програмування, ми можемо контролювати виникнення помилок і якимось чином реагувати на це. Говорять: "ми можемо перехопити виняткову ситуацію".
Спочатку розберемось які виняткові ситуації можуть виникнути.
Синтаксичні помилки
Помилка синтаксису (SyntaxError
) виникає коли синтаксичний аналізатор Python зіштовхується з ділянкою кода,
котрий не відповідає специфікації мови програмування
і який не може бути інтерпретовано.
Синтаксичні помилки у головному модулі програми виникають до початку виконання програми і не можуть бути перехоплені.
Ситуації, у яких синтаксична помилка у вигляді винятка SyntaxError
може бути
перехоплена і оброблена:
- помилка синтаксиса у імпортованому модулі;
- помилка синтаксиса у коді, який представлений символьним рядком і передається функції
eval
абоexec
.
Помилки часу виконання
Ось деякі класичні приклади виняткових ситуацій:
- ділення на нуль;
- помилка при спробі прочитати зовнішні дані;
- вичерпання доступної пам'яті.
Винятки як класи
Винятки в Python — це насправді не що інше, як класи. Давайте переконаємось:
>>> 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> ZeroDivisionError
<class 'ZeroDivisionError'>
>>> ZeroDivisionError.mro()
[<class 'ZeroDivisionError'>, <class 'ArithmeticError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>]
>>>
Базовим класом для винятків є BaseException
.
Від нього успадковуються декілька спеціальних класів,
які вказують на обов'язкове завершення програми,
а також клас Exception
.
Від класа Exception
успадковуються усі інші стандартні класи.
Ось деякі дочірні для Exception
класи:
- ArithmeticError — базовий клас для усіх винятків, пов'язаних з арифметичними операціями.
- BufferError — базовий клас для винятків, пов'язаних з операціями над буфером.
- LookupError — базовий клас для винятків, які виникають при зверненні по неіснуючому ключу чи індексу у послідовностях і відображеннях.
Повний перелік усіх винятків можна знайти у документації, рекомендується ознайомитись з ним.
Також при необхідності ми можемо створити власні винятки,
у цьому разі нам треба успадковуватись від класа Exception
або його дочірніх класів.