3.1 Перехоплення виключень
Ми б не говорили так багато про виключення, якби нам доводилося просто спостерігати за ними. Виключення — це спеціальні об'єкти, з якими може працювати ваша програма на Python. Обробка виключень — це важливий аспект програмування, який дозволяє покращити надійність та стійкість програм.
У Python для перехоплення та обробки виключень використовуються конструкції try, except, else і finally. Ці конструкції дозволяють перехоплювати помилки, що виникають під час виконання програми, та вживати відповідних заходів.
Конструкція try-except
Конструкція try-except використовується для перехоплення та обробки виключень. Блок try містить код, який може викликати виключення, а блок except містить код, який буде виконано у разі виникнення виключення.
Приклад:
try:
result = 10 / 0
except ZeroDivisionError:
print("Помилка: ділення на нуль.")
Якщо в коді всередині блоку try виникне виключення ZeroDivisionError, то воно буде перехоплено блоком except і виконається код з викликом методу print().
Обробка кількох виключень
Ви можете обробляти кілька типів виключень, вказавши їх в окремих блоках except.
try:
result = int("abc")
except ZeroDivisionError:
print("Помилка: ділення на нуль.")
except ValueError:
print("Помилка: некоректне значення.")
Перехоплення всіх виключень
Якщо ви хочете перехоплювати всі виключення, ви можете використовувати блок except без вказівки конкретного типу виключення. Однак це не рекомендується, оскільки може ускладнити налагодження і приховати важливі помилки.
try:
result = 10 / 0
except:
print("Виникла помилка.")
3.2 Оператори else-finally
Крім операторів try та except, є ще два опціональних: else і finally. Зараз я розповім про них трохи детальніше.
Конструкція try-except-else
Блок else використовується для виконання коду, якщо в блоці try не виникло виключень.
try:
result = 10 / 2
except ZeroDivisionError:
print("Помилка: ділення на нуль.")
else:
print(f"Результат: {result}")
Конструкція try-except-finally
Блок finally містить код, який буде виконаний незалежно від того, виникло виключення чи ні. Це корисно для звільнення ресурсів або виконання завершуючих операцій.
try:
result = 10 / 0
except ZeroDivisionError:
print("Помилка: ділення на нуль.")
finally:
print("Цей блок виконується завжди.")
Повний приклад: try-except-else-finally
Приклад:
try:
result = 10 / 2
except ZeroDivisionError:
print("Помилка: ділення на нуль.")
else:
print(f"Результат: {result}")
finally:
print("Цей блок виконується завжди.")
3.3 Приклад try-except-else-finally
Давайте розглянемо якийсь великий реальний приклад. Наприклад, ми намагаємося прочитати дані з файлу на диску — що може бути простіше?
file = open("file.txt", "r")
content = file.read()
print(content)
Що може піти не так? Наприклад, все:
- Файл може бути відсутнім. Його могли випадково видалити, не записати, або ваша програма взагалі виконується на іншому комп'ютері, де його зроду не було.
- Помилка читання файлу. У вашої програми немає до нього доступу, оскільки він знаходиться в директорії, до якої потрібні адмінські права.
- Інша програма зараз пише у цей файл і читати його не можна — у неї монопольний доступ до файлу.
Вам мало? Тоді не забувайте, що незалежно від того, на якому етапі сталася помилка при роботі з файлом, вам обов'язково потрібно його «закрити», щоб операційна система звільнила ресурси, виділені для роботи з цим файлом.
Так що реальний код виглядатиме приблизно так:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("Помилка: файл не знайдено.")
except IOError:
print("Помилка: помилка вводу-виводу.")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("Файл закрито.")
Ласкаво просимо в реальний світ, де вам потрібно писати код не тільки для «робочого сценарію», але і для всіх можливих сценаріїв, які можуть піти не так.
Гаразд, не буду вас лякати — це простіше, ніж здається. Потрібно просто розуміти, що таке граничні умови (corner cases) і вчасно додавати перевірку стандартних помилок. Решту сучасні фреймворки зроблять за вас.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ