JavaRush /Курси /Модуль 1: Python Core /Помилки під час роботи програми

Помилки під час роботи програми

Модуль 1: Python Core
Рівень 10 , Лекція 0
Відкрита

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.
  • Файли і рядки коду: У кожному рядку трасування вказується файл і номер рядка, де відбувся виклик. Це допомагає швидко знайти та виправити помилку в коді.

Практичне використання трасування стека

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

  1. Читання знизу вгору: Починайте аналіз з самого нижнього виклику в трасуванні, оскільки це місце, де сталося виключення.
  2. Перевірка всіх викликів: Вивчіть всі виклики в трасуванні, щоб зрозуміти шлях, по якому передавалося виключення.
  3. Виправлення коду: Використовуйте інформацію з трасування для виправлення коду та запобігання аналогічним помилкам у майбутньому.

Докладніше про винятки ви дізнаєтеся в наступних лекціях.

Коментарі (4)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Vitalii Mykytenko Рівень 2
5 квітня 2025
Для виконання завдання «Помилка роботи з типом» необхідно заглянути до наступної лекції.
Pavlo Kushnir Рівень 2
13 червня 2025
Я просто в функції print ввів аріфметичну операцію з різними типами даних.
Дмитро Рівень 51
30 січня 2026
ми оператор raise раніше проходили, з ним пропускає виконання def func(x, y): if y == 0: raise ZeroDivisionError("Devision by zero") else: return x/y func(3, 0)
Gena Рівень 39
27 квітня 2026
Навіщо так складно? Про створення ф-цій там не сказано. Все простіше 1. a = 10 / 0 2. a = "24" b = a / 4