1.1 Виникнення помилки
Помилки (і винятки) є невіддільною частиною програмування. Вони виникають, коли програма зіштовхується з непередбаченими ситуаціями, які вона не може обробити. У Python існує система обробки винятків, яка дозволяє перехоплювати і обробляти помилки, попереджаючи завершення програми.
Винятки найчастіше виникають у наступних ситуаціях:
Синтаксичні помилки:
Ці помилки виявляються на етапі компіляції коду і пов'язані з неправильною граматикою мови Python. Наприклад, пропущені двокрапки або невірні ключові слова.
if True:
print("Hello")
Помилки часу виконання (Runtime Errors):
Ці помилки виникають під час виконання програми і можуть бути викликані різними причинами, такими як ділення на нуль, доступ до неіснуючого індексу списку, неправильне використання типів даних тощо.
print(1 / 0) # ZeroDivisionError
Логічні помилки:
Ці помилки виникають, коли програма працює без збоїв, але видає неправильний результат через помилку в логіці програми. Логічні помилки не викликають винятків, і їх складніше відлагодити.
Логічні помилки зазвичай називають багами — це як би деяка недоробка функціоналу програми. Помилки ж часу виконання називають винятками. Для кожної такої помилки Python створює спеціальний об'єкт (виняток) і «викидає» його в програму...
1.2 Шлях винятків
Коли в Python виникає виняток, він піднімається по стеку викликів, поки не буде оброблений. Стек викликів представляє собою послідовність викликів функцій, які призвели до виникнення винятку.
Механізм підйому винятків
- Виникнення винятку: Коли відбувається помилка, Python створює об'єкт винятку.
- Пошук обробника винятку: Інтерпретатор Python починає пошук обробника винятку в поточному блоці коду. Якщо обробник не знайдено, він переходить до наступного блоку коду, який викликав поточну функцію.
- Підйом винятку по стеку: Цей процес повторюється, поки не буде знайдений обробник або стек викликів не буде вичерпаний.
- Завершення програми: Якщо обробник не знайдено, програма завершує свою роботу і виводить повідомлення про помилку.
Приклад:
def func_a():
func_b()
def func_b():
func_c()
def func_c():
print(1 / 0) # Тут виникає виняток ZeroDivisionError
func_a()
У цьому прикладі виняток ZeroDivisionError виникає у функції func_c, потім піднімається по стеку викликів через func_b і func_a. Якщо ніде не буде знайдений обробник, програма завершиться з помилкою.
1.3 Читання лога
Коли програма завершується через необроблений виняток, Python виводить трасування стека (traceback), яке допомагає розробникам зрозуміти, що пішло не так. Трасування стека містить інформацію про послідовність викликів функцій, які призвели до виникнення винятку, і може бути проаналізовано для відладки програми.
Приклад трасування стека
Traceback (most recent call last):
File "example.py", line 10, in
func_a() File "example.py", line 2, in func_a func_b() File "example.py", line 5, in func_b func_c() File "example.py", line 8, in func_c print(1 / 0) ZeroDivisionError: division by zero
Аналіз трасування стека
- Тип винятку і повідомлення: В кінці трасування вказується тип винятку та повідомлення. У наведеному прикладі це
ZeroDivisionError: division by zero. - Послідовність викликів: Трасування стека показує послідовність викликів функцій. У нашому прикладі помилка сталася в рядку
print(1 / 0)у функціїfunc_c, яка була викликана зfunc_b, яка в свою чергу була викликана зfunc_a. - Файли і рядки коду: У кожному рядку трасування вказується файл і номер рядка, де відбувся виклик. Це допомагає швидко знайти та виправити помилку в коді.
Практичне використання трасування стека
Трасування стека є важливим інструментом для відладки та аналізу програм. Воно допомагає розробникам зрозуміти причину виникнення помилки і знайти місце в коді, де вона сталася. Ось кілька порад щодо використання трасування стека:
- Читання знизу вгору: Починайте аналіз з самого нижнього виклику в трасуванні, оскільки це місце, де сталося виключення.
- Перевірка всіх викликів: Вивчіть всі виклики в трасуванні, щоб зрозуміти шлях, по якому передавалося виключення.
- Виправлення коду: Використовуйте інформацію з трасування для виправлення коду та запобігання аналогічним помилкам у майбутньому.
Докладніше про винятки ви дізнаєтеся в наступних лекціях.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ