Перейти до змісту

Помилки

Ніколи не помиляється лише той, хто нічого не робить.

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

Винятки

У програмуванні, коли "сталася якась помилка", прийнято казати що "виникла виняткова ситуація". Іншими словами "щось пішло не так, як очікувалось".

В 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 або його дочірніх класів.

Back to top