Винятки
У Python існує мінімум два типи помилок: синтаксичні помилки та винятки. Синтаксичні помилки частіше виникають у програмістів, що вивчають python, через порушення синтаксису. Але спроба запуску коректної з погляду синтаксису програми може призвести до помилки. Помилки, виявлені під час виконання програми, називаються винятками (exception) і не ведуть до падіння програми: їх можна обробляти та відновлювати нормальний потік виконання програми.
Тим не менш, більшість помилок програмою не обробляється і їх виникнення призводить до висновку повідомлення про помилку. Як приклад спробуємо поділити на нуль.
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_13252/2354412189.py
in
module>
---->
1
1/0
ZeroDivisionError: division by zero
Очевидно, з'явилося повідомлення про помилку. Останній рядок цього повідомлення говорить, що конкретно сталося.
- Винятки бувають різних типів і конкретний тип покинутого виключення друкується до двокрапки. В даному випадку це ZeroDivisionError.
- Після типу помилки виводиться додаткова інформація, яка може залежати від типу помилки та причини її виникнення.
- Все, що йде до останнього рядка, демонструє в якому контексті виникла помилка у вигляді трасувальних даних. Наочніше уявлення про трасувальній інформації дає приклад, коли помилка виникає всередині декількох функцій.
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_13252/4200539898.py
in
module>
5
f()
6
---->
7
g()
~\AppData\Local\Temp/ipykernel_13252/4200539898.py in g()
3
4
def
g():
---->
5
f()
6
7
g()
~\AppData\Local\Temp/ipykernel_13252/4200539898.py in f()
1
def
f():
---->
2
1/0
3
4
def
g():
5
f()
ZeroDivisionError: division by zero
Цього разу повідомлення про помилку набагато довше, тому що помилка виникла не на верхньому рівні, а на рівні функції.
Вбудовані винятки
Наприклад, якщо спробувати звернутися до неоголошеної змінної (неіснуючого імені), то виникне помилка NameError. пошук у словнику по неіснуючому ключа - KeyError і т.д.
У ряді ситуацій python збуджує виняток не в результаті помилки, а в службових цілях Наприклад, як обговорювалося раніше, функції, що працюють з об'єктами, що ітеруються, очікують виняток StopIteration, тобто поява такого виключення — не є винятковою ситуацією, пов'язаною з логічною помилкою в коді. , а лише механізм, яким об'єкт, що ітерується, повідомляє клієнтському коду, що елементи в ньому вичерпалися.
У python все є об'єктом, у тому числі й виняток. створюється екземпляр виключення відповідного типу і цей виняток починає поширюватися. ієрархії, з якою можна ознайомитись за посиланням.
Так, на самому верху розташовується базовий клас BaseException, від якого успадковуються всі інші типи винятків.На другому поверсі розташовуються винятки пов'язані з завершенням виконання програми (наприклад, SystemExit виникає при виклику функції sys.exit(), KeyboardInterrupt виникає, якщо користувач натискає клавішу, що перериває, під час роботи програми), а так само клас Exception, який і є базовим класом для всіх винятків не пов'язаних із завершенням програми.
З повним списком вбудованих винятків можна ознайомитись на сторінці офіційної документації.
Порушення винятків. raise #
Багато винятків кидаються інтерпретатором python при виявленні помилки або у службових цілях. Для цього використовується ключове слово raise, праворуч від якого вказується екземпляр виключення.
raise
Exception("Мій перший виняток!")
---------------------------------------------------------------------------
Exception Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_13252/2359356075.py
in
module>
---->
1
raise
Exception("Мій перший виняток!")
Exception: Мій перший виняток!
Коли виняток порушено, він починає поширюватися, тобто. нормальне виконання програми припиняється. Так, наприклад, залишити функцію можна не тільки використовуючи ключове слово return, але і ключовим словом raise.
def
f():
print("До винятку!")
raise
Exception("Виняток!")
print("Після виключення!")
f()
---------------------------------------------------------------------------
Exception Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_13252/2985915162.py
in
module>
4
print("Після виключення!")
5
---->
6
f()
~\AppData\Local\Temp/ipykernel_13252/2985915162.py in f()
1
def
f():
2
print("До винятку!")
---->
3
raise
Exception("Виняток!")
4
print("Після виключення!")
5
Exception: Виняток!
Бачимо, що інструкція print("До винятку!") Виконалася, а інструкція print("Після виключення") - ні, т.к.відразу після порушення винятку нормальний потік виконання програми припинився і виняток почав поширюватися. Виняток поширюється нагору по стеку викликів, доки не зустрінеться блок, який обробляє цей виняток. Якщо такий блок так і не зустрічається, то виводиться повідомлення про помилку і програма падає (або може продовжити очікування інструкцій від користувача в інтерактивному режимі, що відбувається, наприклад, у ноутбуках jupyter).
Обробка винятків.
Обробка помилок у python здійснюється за допомогою інструкції try, яка може зустрічатися в блоках двох видів:
Блок try/except #
За допомогою блоку try/except можна обробляти певні типи винятків. У найпростішій формі він виглядає приблизно так.
try:
інструкції
except
ТипВиключення:
інструкції
Після ключового слова try поміщаються інструкції, виконання яких може призвести до виключення. Інструкції в блоці except виконуються тільки якщо а) вчасно виконання інструкцій у блоці try виникла помилка і б) її тип співпав із зазначеним типом.
Як приклад знову поділимо на нуль, але цього разу помістимо цей поділ у блок try/except і обробимо виняток ZeroDivisionError.
try:
1/0
print("Після спроби поділу.")
except
ZeroDivisionError:
print("Перехоплено помилку поділу на нуль!")
Перехоплено помилку поділу на нуль!
- повідомлення про помилку з типом помилки та трасувальною інформацією не з'явилося, т.к. помилка була опрацьована;
- замість цього виконалася інструкція print у блоці except ZeroDivisionError;
- інструкція print у блоці try після розподілу на нуль не виконалася, т.к. помилка виникла раніше і почала поширюватись.
Коли виняток виникає, воно починає поширюватися вгору по стеку функцій, а нормальне виконання програми припиняється. Як тільки зустрічається перший блок except збігаючого типу, поширення виключення припиняється і виконується код цього блоці.
Наведемо кілька прикладів, щоб продемонструвати цей механізм.
Наступний приклад демонструє, що виняток продовжує поширюватися, доки не зустріне правильний блок except .
try:
try:
1/0
except
NameError:
print("Помилка перехоплена внутрішнім блоком try/except.")
except
ZeroDivisionError:
print("Помилка перехоплена зовнішнім блоком try/except.")
print("Інструкція після виключення.")
Помилка перехоплена зовнішнім блоком try/except. Інструкція після обробки виняток.
Тут виняток ZeroDivisionError виник у внутрішньому блоці try/except , але тип винятку, що виник, не збігся з NameError . У результаті внутрішній блок try/except помилку не обробило і вона продовжила поширюватися, внаслідок чого потрапила до зовнішнього блоку try/except , який обробляє помилки типу ZeroDivisionError , що призвело до припинення поширення помилки та до виконання інструкції print у зовнішньому блоці. Далі програма продовжує виконуватись у нормальному режимі.
Наступний приклад демонструє, що виняток припиняє поширюватися, коли зустріне правильний блок except .
try:
try:
1/0
except
ZeroDivisionError:
print("Помилка перехоплена внутрішнім блоком except.")
except
ZeroDivisionError:
print("Помилка перехоплена зовнішнім блоком except.")
print("Інструкція після виключення.")
Помилка перехоплена внутрішнім блоком except. Інструкція після обробки виняток.
Тут внутрішній блок try/except обробляє правильний виняток.Виняток, що виник, припиняє поширюватися в цьому внутрішньому блоці try/except і виконується інструкція print у внутрішньому блоці except . Т.к. виконання інструкцій після зовнішнього ключового слова try проходить без помилок (помилка виникає, але зовнішній блок її не помічає, тому що вона обробляється внутрішнім блоком try/except), зовнішній блок except ігнорується.
Блоків except може бути в одному блоці try/except , що дозволяє по-різному реагувати на помилки різних типів.
try:
1/0
except
NameError:
print("Перехоплено помилку NameError")
except
ZeroDivisionError:
print("Перехоплено помилку ZeroDivisionError")
Перехоплена помилка ZeroDivisionError
Інтерпретатор читає блоки except зверху донизу та зупиняється на першому, який обробляє виняток правильного типу. Т.к. типи винятків розташовуються в ієрархії між собою, необхідно дотримуватися наступного правила.
Спочатку завжди обробляйте найспецифічніші винятки, а вже потім більш загальні.
Якщо не дотримуватись цього правила, то специфічні блоки except будуть недосяжні. Продемонструємо це з прикладу, скориставшись тим, що Exception є базовим класом майже всім інших вбудованих винятків, отже винятки цього є чи не найзагальнішими.
try:
1/0
except
Exception:
print("Перехоплено несподіваний виняток!")
except
ZeroDivisionError:
print("Перехоплено виняток ZeroDivisionError!")
Перехоплено несподіваний виняток!
Тут у блоці try виникає виняток ZeroDivisionError і починає поширюватися.У блоці except Exception перевірка на тип успішно проходить (ієрархія між ними виглядає так: Exception \(\to\) ArithmeticError \(\to\) ZeroDivisionError ), а значить викликається інструкції у відповідному блоці, а до блоку except ZeroDivisionError справа так і не доходить: помилка оброблена раніше.
Правильніше в цьому випадку було б змінити ці блоки місцями.
try:
1/0
except
ZeroDivisionError:
print("Перехоплено виняток ZeroDivisionError!")
except
Exception:
print("Перехоплено несподіваний виняток!")
Перехоплено виняток ZeroDivisionError!
Додаткові можливості except #
Після except можна вказати цільову змінну, щоб отримати доступ до об'єкта виключення синтаксисом
except
ТипВиключення
as
мета:
операції
над
мета
З деяких об'єктів виключень можна отримати додаткову інформацію про контекст, у якому вони порушилися. У всіх стандартних винятків перетворення до рядка визначено таким чином, щоб виводити повідомлення, вказане під час створення.
try:
raise
Exception("Повідомлення про виключення!")
except
Exception
as
e:
print(e)
Повідомлення виключення!
Після ключового слова except необов'язково має бути зазначений лише один тип виключення: можна вказати кортеж.
try:
1/0
except
(ZeroDivisionError,
NameError):
print("Виник ZeroDivisionError або NameError!")
Виникли винятки ZeroDivisionError або NameError!
Так само, в самому кінці блоку try/except можна додати блок else , інструкції в якому виконуватися тільки якщо блок try завершиться без помилок. Щоб продемонструвати це, визначимо функцію divide , яка намагатиметься ділити перший аргумент на другий і повертати результат поділу, якщо поділ відбулося успішно, і повертати нескінченність, якщо другий параметр дорівнює нулю.
def
divide(a,
b):
try:
result
=
a
/
b
except
ZeroDivisionError:
print("Спроба поділу на нуль.")
return
float("inf")
else:
print("Поділ відбувся успішно.")
return
result
Блок else у цій функції виконається, тільки якщо в блоці try поділ відбудеться успішно, тобто. якщо не виникне помилки поділу на нуль.
print(divide(42,
14))
print(divide(42,
0))
Поділ відбувся успішно. 3.0 Спроба поділу на нуль. inf
Блок try/finally #
Синтаксис блоку try/except має такий вигляд.
try:
інструкції
finally:
інструкції
Інструкції в блоці finally виконаються незалежно від того, виникне помилка в блоці try чи ні. Якщо помилка все ж таки виникає, то виконується код у блоці finally і помилка продовжує поширюватися.
Цей блок часто називають обробником очищення: часто в ньому розміщують інструкції, які виконують чищення (наприклад, звільнення ресурсів). Це дозволяє гарантувати, що інструкції у цьому блоці виконаються у будь-якому випадку.
Наприклад, раніше часто зустрічалися конструкції такого виду.
f
=
open(some_file,
"w")
try:
do_something_with_file(f)
finally:
f.close()
Тобто. операції над відкритим файлом проводилися в блоці try/finally , що гарантувало, що файл буде закритий, навіть якщо виняток. Сьогодні набагато зручніше використовувати контекстні менеджери with для таких цілей.
Блок try/except/finally #
Якщо зустрічається блок обробки помилки, в якому зустрічаються і except і finally , його можна представити у вигляді вкладення блоку try/except всередину блоку try/finally . Іншими словами, наступні дві конструкції поводяться однаково.
try:
інструкції
except
ОдинException:
інструкції
else:
інструкції
finally:
інструкції
try:
try:
інструкції
except
ОдинException:
інструкції
else:
інструкції
finally:
інструкції
Для демонстрації роботи блоку такого виду наведемо приклад із документації.
def
divide(x,
y):
try:
result
=
x
/
y
except
ZeroDivisionError:
print("Спроба поділу на нуль!")
else:
print(f"Результат поділу
result>")
finally:
print("Виконання блоку 'finally'.")
Функція divide намагається поділити x на y.
Якщо поділ відбувається успішно (else), то виводиться результат.
Результат поділу 2.0 Виконання блоку 'finally'.
Якщо виникає помилка поділу на нуль, вона перехоплюється і виводиться відповідне повідомлення.
Спроба поділу на нуль! Виконує блок 'finally'.
Якщо виникає помилка іншого, то її поширення триває.
Обробка винятків у Python
Одним із фундаментальних аспектів Python, який сприяє його надійності, є система обробки винятків. Винятки Python - це помилки, виявлені під час виконання, які можуть порушити нормальний потік програми. Розуміння винятків критично важливе для написання надійного та ефективного коду на Python.
Виняток у Python може виникнути в різних ситуаціях, наприклад при розподілі на нуль, доступі до неіснуючого файлу або спробі імпортувати неіснуючий модуль. Замість того, щоб дозволити цим помилкам завершити програму, Python дозволяє програмісту перехоплювати та обробляти ці винятки. Це робиться через блок try-except, де програміст намагається виконати код, який може викликати виняток у блоці try, та обробляє виняток у блоці except.
Система винятків Python є ієрархічною, всі винятки успадковуються від класу BaseException. Ця система включає вбудовані винятки, такі як IOError, ValueError, ZeroDivisionError та багато інших.Програмісти також можуть визначати свої власні винятки для обробки конкретних умов помилок, унікальних для їх додатків.
Для чого потрібні Exceptions?
У програмуванні на Python винятки є важливою частиною написання чистого, надійного та ефективного коду. Винятки використовуються для обробки помилок та керування потоком програми, коли виникають несподівані проблеми. Використовуючи структуру try except, програмісти можуть передбачати потенційні проблеми та забезпечити, щоб їх код міг упоратися з незвичайними обставинами без збоїв. Механізм винятків Python підвищує надійність коду та користувальницький досвід за рахунок обробки помилок та надання інформативного зворотного зв'язку.
Розуміння Try Except у Python
Базова структура обробки винятків у Python включає блоки try і except . Ось як це працює:
- Блок Try: Цей блок містить код, який може генерувати виняток чи помилку. Python спробує виконати цей код, і якщо помилка, він зупинить виконання цього блоку і перейде до блоку except .
- Блок Except: Код у цьому блоці буде виконано, якщо у блоці try станеться помилка. Це дозволяє обробляти помилки, вести журнал або робити дії щодо відновлення.
Приклад: Базовий Try Except
try: result = 10 / 0 except ZeroDivisionError: print("Cannot divide by zero!")
Обробка кількох винятків
Python дозволяє обробляти кілька винятків, щоб розрізняти різні типи помилок. Ця можливість є критично важливою для створення більш деталізованої логіки обробки помилок та надання специфічних відповідей для різних умов помилок.
Приклад: Декілька Try Except
try: with open('non_existent_file.txt', 'r') як файл: print(file.read()) except FileNotFoundError: print("The file does not exist.") except Exception as e: print(f"An error occurred: ")
Рекомендації щодо використання Exceptions
Правильне використання винятків є ключем до максимізації їх переваг у вашому коді на Python. Ось кілька кращих практик, які слід слідувати:
- Використовуйте специфічні класи винятків по можливості, замість перехоплювати всі винятки. Ця практика підвищує ясність та надійність обробки помилок.
- Уникайте порожнього except: Завжди уточнюйте тип виключення, який потрібно перехопити, щоб запобігти перехопленню несподіваних винятків.
- Використовуйте finally для очищення: Блок може бути використаний для гарантії виконання певних дій, таких як закриття файлу, незалежно від того, чи відбулося виключення.
Примітка: При використанні винятків важливо знайти баланс між обробкою реальних помилок та керуванням потоком програми. Надмірне використання винятків для керування потоком може призвести до коду, який важко зрозуміти та підтримувати.
Коли Використовувати Винятки
У програмуванні на Python винятки слід використовувати у ситуаціях, коли помилка очікувана і може бути оброблена таким чином, що програма може продовжити роботу або коректно завершитись. Це включає, але не обмежується:
- Операції введення/виводу
- Робота з файлами або мережевими з'єднаннями
- Розбір даних
- Робота із зовнішніми API або бібліотеками, які можуть видавати збої за певних умов
Ефективне використання винятків дозволяє розробникам на Python створювати стійкі програми, здатні пережити помилки і забезпечити плавний користувальницький досвід.
Типи Винятків
При роботі з Python ефективне оброблення помилок має вирішальне значення для створення надійних додатків. Python надає ієрархію типів винятків, дозволяючи розробникам перехоплювати та реагувати на різні помилки в їхньому коді. Розуміння цих типів та як print інформацію про виключення може значно допомогти у налагодженні та обробці помилок.
Поширені типи винятків
Винятки Python охоплюють широкий діапазон типів помилок, від помилок синтаксису до помилок виконання. Ось погляд на деякі типи винятків, що часто зустрічаються:
- SyntaxError : Виникає, коли Python не може зрозуміти ваш код.
- NameError : Якщо локальне або глобальне ім'я не знайдено.
- TypeError : Викликано операцією або функцією, застосованою до об'єкта невідповідного типу.
- ValueError : Виникає, коли функція отримує аргумент із правильним типом, але невідповідним значенням.
- IndexError : Спрацьовує при спробі доступу до індексу, що виходить за діапазон.
Як Вивести Тип Exceptions
Коли відбувається виняток, можливо корисно знати, з яким саме типом винятку ви маєте справу. Ви можете перехопити і print тип виключення, використовуючи оператори try та except з except Exception as e .
Приклад: Друк Винятки
try: # Цей випадок зменшуєтьсяВалюмError print(int("xyz")) except Exception as e: print(f"Caught an exception: ")
Caught an exception: ValueError
Приклад: Друк Конкретних Винятків
Ви також можете відловлювати та обробляти кілька конкретних винятків окремо:
try: # Code , що може бути невиразним винятком результату = 10 / 0 except ZeroDivisionError як e: print(f"Caught a division error: ") except ValueError as e: print(f"Caught a value error: ")
Цей код конкретно повідомить вам, чи було перехоплено виняток ZeroDivisionError або ValueError.
Використання Таблиці Ієрархії Винятків
Ієрархія винятків Python дозволяє перехоплювати винятки на основі їхньої специфічності. Ось спрощений вид ієрархії винятків:
| Базове Виняток |
Наслідується Від |
Опис |
| BaseException |
N/A |
Базовий клас для всіх вбудованих винятків |
| Exception |
BaseException |
Усі вбудовані винятки, що не призводять до завершення системи |
| ArithmeticError |
Exception |
Базовий клас для помилок арифметики |
| BufferError |
Exception |
Викликається, коли операція, пов'язана з буфером, не може бути виконана |
| LookupError |
Exception |
Базовий клас для помилок пошуку |
Примітка: Ця таблиця не охоплює всі можливі винятки, але дає уявлення про структуру спадкування, яка може бути корисною для ефективного перехоплення винятків.
Обробка Винятків
Обробка винятків у Python - це критично важливий аспект написання надійного та підтримуваного коду. Виняток у Python – це подія, яка порушує нормальний потік програми. Python надає вбудовані винятки та дозволяє користувачам визначати свої власні. Знання того, як правильно перехоплювати та обробляти ці винятки, має вирішальне значення для налагодження та запобігання помилкам у ваших додатках.
Вбудовані Винятки Python
Вбудовані винятки Python охоплюють широкий спектр умов помилок. Від ValueError , який вказує на невідповідне значення, до FileNotFoundError , який сигналізує про те, що файл не може бути знайдений, ці винятки допомагають розробникам швидко діагностувати проблеми.
Перехоплення Винятків З Допомога try і except
Базова структура для обробки винятків у Python включає блоки try і except . Ви поміщаєте код, який може викликати виняток, всередині блоку try , а код для виконання, якщо відбувається виняток, у блоці except .
Приклад: Базовий Блок try та except
try: # Code that might raise exception result = 10 / 0 except ZeroDivisionError: print("Caught a division by zero!")
У наведеному вище коді спроба поділу на нуль викликає ZeroDivisionError, який потім перехоплюється блоком except, запобігаючи аварійному завершенню програми.
Перехоплення будь-якого Винятку
Щоб перехопити будь-який виняток, можна використовувати просту конструкцію except: , яка перехопить усі винятки. Однак перехоплення всіх винятків зазвичай не рекомендується, оскільки це може ускладнити налагодження.
Приклад: Перехоплення будь-якого Винятку
try: # Code that might raise any exception result = 10 / unknown_var except: print("An unexpected error occurred!")
Обробка Конкретних Винятків
Для більш тонкого контролю над тим, які винятки перехоплювати, Python дозволяє вказувати кілька блоків except, кожен з яких обробляє різні типи винятків.
Except із SystemExit
Особлива обережність необхідна під час роботи з SystemExit, оскільки перехоплення цього виключення може заважати нормальному процесу завершення роботи скрипта. SystemExit викликається функцією sys.exit() і в загальному випадку має бути дозволений до розповсюдження.
Примітка: Використовуйте except SystemExit , щоб явно перехопити виняток SystemExit , якщо вам потрібна конкретна операція очищення перед виходом зі скрипта.
Логування Винятків
Логування винятків може надати масу інформації для налагодження.Модуль logging Python може бути використаний для логування винятків, надаючи не тільки повідомлення про помилку, а й трасування.
Приклад: Приклад Логування Винятки
import logging try: # Code that might raise an exception result = 1 / 0 except ZeroDivisionError: logging.exception("Exception occurred")
Це буде записувати повідомлення виключення разом із трасуванням, допомагаючи у налагодженні.
Найкращі Практики Обробки Винятків
- Перехоплюйте конкретні виняткиколи це можливо.
- Використовуйте finally для дій з очищення, які мають бути виконані у будь-якому випадку.
- Уникайте перехоплення SystemExit якщо у вас немає на те вагомих причин.
- Записуйте винятки для допомоги у налагодженні.
- Використовуйте користувацькі винятки для більш чіткої звітності про помилки.
Дотримання цих рекомендацій покращить надійність і ясність вашого Python коду при роботі з винятками.
Генерація Винятків
При розробці додатків на Python, граційна обробка помилок є критично важливою для забезпечення надійності та стійкості вашого програмного забезпечення. Генеруючи винятки, можна контролювати потік вашої програми, коли виникають несподівані ситуації. Ця стаття охоплює основи виклику винятків у Python, надаючи розуміння, як ефективно викликати виняток або кинути виняток у вашому коді.
Розуміння Обробки Винятків
Обробка винятків - це фундаментальне поняття в Python, яке дозволяє розробнику передбачати та керувати помилками під час виконання програми. Коли говорять про виклик виключення в Python, це часто стосується навмисного створення винятків, коли виконуються певні умови.
Як raise Виняток
Виклик виключення в Python простий.Ви можете використовувати ключове слово raise , за яким слідує екземпляр виключення, яке ви хочете кинути. Це зазвичай називається викликом виключення.
Приклад: Виклик ValueError
def check_age(age): if age < 18: raise ValueError("Access denied due to age restrictions.") return "Access granted." try: user_status = check_age(17) print(user_status) except ValueError як err: print(err)
Примітка: У цьому прикладі спроба викликати check_age з аргументом менше 18 призводить до ValueError , який потім перехоплюється в блоці except .
Генерація Власного Винятку
Ви також можете визначати власні класи винятків, успадковуючи від вбудованого в Python класу Exception . Це корисно, коли необхідно згенерувати виняток, який більш специфічний для контексту вашої програми.
class AgeRestrictionError(Exception): """Exception raised for errors in age restrictions.""" def __init__(self, message="Age is below the required limit."): self.message = message super().__init__(self .message) def verify_age(age): if age < 18: raise AgeRestrictionError return "Версування успішного." try: result = verify_age(16) print(result) except AgeRestrictionError як err: print(err)
Примітка: Винятки користувача дозволяють створювати більш описові помилки, роблячи ваш код простіше для розуміння і налагодження.
Коли Використовувати Обробку Винятків
Ось обставини, за яких ви можете захотіти raise виняток:
- Перевірка введення: Переконайтеся, що дані, що вводяться у функцію, є дійсними.
- Доступність ресурсів: Перевірте, чи доступні необхідні ресурси (наприклад, файли або мережа).
- Результати операції: Перевірте результат операції, щоб переконатися, що він відповідає певним критеріям.
Використання винятків, де це доречно, забезпечує не тільки надійність вашого коду, а й його легкість в обслуговуванні та розумінні.
| Ситуація |
Причина для порушення виключення |
| Неправильні параметри |
Щоб запобігти продовженню роботи функцій зі значеннями, які можуть призвести до несподіваних результатів |
| Збій операції |
Щоб зупинити потік виконання, коли операцію не можна завершити, як передбачалося |
| Управління ресурсами |
Щоб переконатися, що ресурси, такі як файли або мережеві з'єднання, дійсно доступні, і їх можна використовувати |
Розуміння та застосування стратегій порушення винятків є життєво важливими навичками у програмуванні на Python. Вони не тільки допомагають зробити ваш код більш надійним, але й сигналізують іншим розробникам про можливі підводні камені. Пам'ятайте, що ефективна обробка винятків може значно покращити налагодження та стійкість вашої програми.
Використання Конструкції try/except/else
При роботі з Python обробка винятків стає невід'ємною частиною написання надійного та безпомилкового коду. Конструкція try/except/else - потужна функція, яка дозволяє розробникам передбачати потенційні помилки, витончено їх обробляти, а також виконувати код, який повинен виконуватися, якщо винятки не були викликані. Це керівництво продемонструє, як ефективно використовувати цю конструкцію на прикладах, зосереджуючись на тому, як print та викидати винятки у Python.
Розуміння try/Except/else
Блок try дозволяє перевірити блок коду наявність помилок. Блок except дозволяє обробити помилку. Блок else виконує частину коду, коли винятків немає. Вміння професійно використовувати ці конструкції може значно покращити надійність та читання вашого коду.
Приклад: Основний Синтаксис try/except/else
try: pass # Attempt to execute this code except ExceptionType: pass # Handle the exception else: pass # Execute code if no exceptions
Приклади Використання try/except/else
Давайте поринемо у практичні приклади, щоб зрозуміти, як застосовувати ці конструкції у повсякденних задачах програмування.
Приклад: Обробка Помилки ZeroDivisionError
Тут ми будемо обробляти помилку поділу на нуль, яка є звичайною пасткою для початківців.
try: result = 10 / 0 except ZeroDivisionError: print("ZeroDivisionError: Cannot divide by zero.") else: print(f"Division result is ")
У цьому прикладі блок except перехоплює ZeroDivisionError , тим самим запобігаючи падінню програми, і використовує print exception python для інформування користувача про помилку.
Приклад: Читання файлу з обробкою виключень
Читання файлів, не знаючи, чи вони існують, може призвести до IOError . Ось як обробляти такі ситуації.
try: with open('nonexistent_file.txt', 'r') як файл: print(file.read()) except IOError: print("IOError: File not found.") else: print("File read successfully." )
Цей фрагмент коду інформує користувача, коли файл не існує, замість раптово завершувати програму.
Друк та Створення Винятків
Як print Виняток
Друк конкретної проблеми може допомогти у налагодженні. Ви можете перехопити і print виняток наступним чином:
try: # some code that can raise exception except exception as e: print(f"An error occurred: ")
Кращі Практики Використання try/except/else
Ось короткий виклад кращих практик при використанні конструкції try/except/else в Python:
- Перехоплюйте конкретні винятки: Завжди намагайтеся перехоплювати конкретні винятки, а не використовувати широку інструкцію except. Такий підхід запобігає перехопленню ненавмисних винятків.
- Використовуйте Else для коду, залежного від блоку Try: Блок else повинен містити код, який повинен виконуватися, тільки якщо блок try не викликав виняток.
- Тримайте блок try мінімальним: Включайте в блок try тільки код, який може викликати виняток, щоб уникнути перехоплення винятків, які не повинні обробляти блок except.
Дотримуючись цих практик, розробники можуть забезпечити ефективність та легкість усунення несправностей свого коду на Python.
Використання Конструкції try/finally
При написанні коду важливо переконатись, що певні операції виконуються у будь-якому випадку. Це особливо важливо при роботі із зовнішніми ресурсами або діями, які мають бути завершені, наприклад, при закритті файлу або мережного з'єднання. Python надає потужну конструкцію для вирішення цього завдання: механізм try/finally, невід'ємна частина обробки винятків, що забезпечує виконання коду очищення або завершення.
Що Таке Конструкція try/finally
У Python конструкція try/finally використовується визначення блоку try, де частина try дозволяє перевірити блок коду на наявність помилок, а частина finally дозволяє виконати код, незалежно від результату блоку try. Ця структура забезпечує виконання блоку finally навіть якщо у блоці try сталася помилка.
Ця конструкція особливо важлива для керування ресурсами, такими як робота з файлами або мережевими з'єднаннями, де ви повинні переконатися, що ресурси правильно звільнені після їх використання незалежно від того, чи відбулася помилка чи ні.
Як Використовувати try/finally
Ось покрокове керівництво:
- Почніть з ключового слова try , за яким слідує двокрапка, щоб почати блок try.
- Напишіть код, який ви хочете виконати і який може викликати помилку всередині блоку try.
- Після блоку try використовуйте ключове слово finally , за яким слідує двокрапка, щоб почати блок finally.
- Напишіть код, який має бути виконаний незалежно від того, чи помилка відбулася в блоці try.
Примітка: Конструкція try/finally може бути використана з блоком except або без нього. Однак цей розділ зосереджений на використанні без явної обробки винятків (except).
Приклади Коду Для try/finally
Щоб проілюструвати конструкцію try/finally , розглянемо два приклади.
Уявіть, що ви працюєте з файлом і хочете переконатися, що він правильно закритий після ваших операцій:
try: f = open("test.txt", "r") print(f.read()) finally: f.close() print("File has been closed.")
У цьому прикладі незалежно від того, що відбувається після відкриття файлу, блок finally гарантує, що файл буде закритий.
Ось приклад, пов'язаний із більш загальним сценарієм управління ресурсами:
resource_allocated = False try: print("Allocating Resource") resource_allocated = True # Simulate error raise Exception("An error occurred!") finally: if resource_allocated: print("Cleaning up Resource")
Навіть якщо помилка відбувається та генерується після виділення ресурсу, блок finally виконується, забезпечуючи очищення ресурсу.
Кращі Практики Використання try/finally в Python
- Управління ресурсами: Завжди використовуйте try/finally під час роботи з керуванням ресурсами, такими як робота з файлами, мережна взаємодія або робота з базами даних, щоб переконатися, що ресурси правильно звільняються.
- Уникайте складної логіки в Finally: Тримайте логіку блоку finally простий і зрозумілийЙого основна мета - очищення та звільнення ресурсів.
- Налагодження та реєстрація помилок: Хоча конструкція try/finally не обробляє винятки, переконайтеся, що будь-які потенційні помилки занесені до журналу або керуються поза цією конструкцією для кращого налагодження та відстеження помилок.
Об'єднання finally та except через Вкладення
При роботі з обробкою винятків у Python важливо розуміти, як ефективно керувати і помилками, і процесом очищення. Об'єднання блоків finally і except через вкладення надає витончений спосіб обробки винятків (except Exception as e) і забезпечення виконання необхідних операцій очищення незалежно від того, чи помилка сталася. Цей підхід особливо корисний у сценаріях, коли вам потрібний високий рівень контролю над обробкою помилок та управління ресурсами.
Розуміння Вкладеного Try Except у Python
Вкладення інструкцій try у Python дозволяє більш тонко підходити до обробки винятків. Розміщуючи блок try-except всередині іншого блоку try, ви можете перехоплювати винятки більш детально. Ця техніка, відома як python nested try except, корисна під час роботи з кодом, який може викликати кілька типів винятків.
Основні Вкладені try except
try: # Outer try block try: # Possible error-prone code result = 10 / 0 except ZeroDivisionError as e: print(f"Caught an exception: ") finally: print("This is the inner finally block executing.") except Exception as e: # Outer except block print(f"Outer exception caught: ") finally: print("This is the outer finally block executing.")
У цьому прикладі ми обробляємо ZeroDivisionError всередині внутрішнього блоку try-except демонструючи метод універсальної обробки винятків. Обидва блоки finally гарантують, що код очищення буде виконаний, показуючи, як ефективно об'єднати блоки finally та except.
Просунутий сценарій
try: # Outer block attempting file operations with open("nonexistent_file.txt", "r") as f: content = f.read() try: # Code that could potentially cause another exception process_content(content) except Exception as e: print(f"Error processing content: ") finally: print("Inner clean-up code executed.") except FileNotFoundError як e: print(f"File error: ") finally: print("Outer clean-up code executed, ensuring resources are freed.")
Цей приклад ілюструє обробку конкретного FileNotFoundError і загального виключення з використанням підходу except exception as e. Вкладені блоки try-except дозволяють точно контролювати обробку винятків та управління ресурсами.
Примітка: Завжди переконайтеся, що блок finally містить код, який має бути виконаний, наприклад, закриття файлів або звільнення системних ресурсів, щоб запобігти витоку ресурсів.
Переваги Вкладеності Finally та Except
- Поліпшена обробка помилок: Дозволяє обробляти різні винятки на кількох рівнях, забезпечуючи гнучкість.
- Управління ресурсами: Гарантує виконання коду очищення, що є важливим для управління ресурсами, такими як обробники файлів або мережні з'єднання.
- Читання коду: Спрощує розуміння, яка частина коду відповідальна за обробку конкретних винятків.
Використання вкладених блоків try-except у поєднанні з finally є потужним патерном в обробці винятків. Він надає необхідний інструментарій для написання надійного та толерантного до помилок коду, забезпечуючи як точну обробку помилок, так і ефективне управління ресурсами.Цей підхід особливо корисний у складних програмах, де нездатність звільнити ресурси або коректно обробити помилки може мати серйозні наслідки.
Об'єкти Винятків
При роботі з Python зустріч з помилками та винятками неминуча. Винятки - це об'єкти в Python, які порушують нормальний перебіг виконання програми, коли відбувається помилка. Python надає ієрархію вбудованих класів винятків, які можуть бути розширені для створення винятків користувача. Цей механізм має вирішальне значення для обробки помилок та сприяє надійності додатків на Python.
Що Таке Винятки
Винятки – це об'єкти, які інкапсулюють інформацію про помилки, що виникають під час виконання програми. Коли відбувається помилка, Python генерує об'єкт виключення. Якщо його не оброблено, цей об'єкт поширюється вгору і може призвести до завершення програми. Коректне оброблення винятків дозволяє вашій програмі витончено реагувати на помилки.
Клас Винятків Python
Базовим класом для всіх винятків у Python є Exception. Цей клас може бути підкласифікований для створення винятків користувача, що дозволяє розробникам додавати додаткову функціональність або інформацію до своїх процедур обробки винятків.
Створення Виключення користувача
Щоб створити виняток, ви просто підкласифікуєте клас Exception і визначите будь-які додаткові методи або властивості, які вам потрібні.
class MyCustomError(Exception): ""A custom exception class.""" pass
Додавання Повідомлення про виключення
При виклику виключення користувача корисно надати докладне повідомлення про помилку, передавши рядок в конструктор виключення. Це повідомлення зберігається в атрибуті args об'єкта виключення.
raise MyCustomError("This is an error message")
Робота з Об'єктами Винятків
Коли виникає виняток, можна перехопити, використовуючи блок try і except . Потім об'єкт виключення може бути доступний у блоці except для отримання інформації про помилку.
- Перехоплення винятків
- Доступ до повідомлення про виняток
- Користувальницька обробка в залежності від типу виключення
Доступ до Повідомлення Винятки
У цьому прикладі ми отримуємо доступ до повідомлення про виключення всередині блоку except :
try: raise ValueError("A sample value error") except ValueError як e: print("Exception:", str(e))
Примітка: Завжди розглядайте можливість використання вбудованих виняткових класів, перш ніж створювати власні, оскільки ваші потреби вже можуть бути задоволені стандартною бібліотекою Python.
Використання Винятків під час Проектування Програми
При роботі з Python акуратне поводження з помилками є критично важливою частиною проектування надійних додатків. Конструкція try except дозволяє перехоплювати і обробляти помилки, запобігаючи непередбаченому аварійному завершенню роботи програми. Обробка винятків не лише про перехоплення помилок, а й про надання значних повідомлень про помилки і, при необхідності, про полегшення процесу розробки чи налагодження шляхом виведення трасування стека. Давайте розглянемо, як можна ефективно проектувати винятки Python.
Використання Повідомлень про Помилки try/except
Коли відбувається помилка, дуже важливо надати користувачеві або розробнику ясне та інформативне повідомлення про помилку. Це можна досягти за допомогою блоків try та except у Python. Ось приклад:
try: # Code block where you suspect an error might occur result = 10 / 0 except ZeroDivisionError as e: print(f"An error occurred: ")
У цьому прикладі, якщо відбувається розподіл на нуль, блок except перехоплює ZeroDivisionError і виводить повідомлення користувача про помилку.
Приклад: Друк Стека Винятків
Для налагодження цілей може бути важливо побачити послідовність викликів функцій, які призвели до помилки. Ось де друк стека викликів стає корисним. Python надає модуль traceback, який може бути використаний для print стека викликів. Ось як це можна зробити:
import traceback try: # Code block where an error is expected result = 10 / 0 except ZeroDivisionError: traceback.print_exc()
Цей фрагмент коду не тільки перехопить ZeroDivisionError, але й print стек викликів, що спростить налагодження помилки.
Найкращі Практики Проектування Винятків
При обробці винятків слід дотримуватися кількох найкращих практик:
- Перехоплюйте конкретні винятки: Завжди намагайтеся перехоплювати конкретні винятки, а не перехоплювати усі винятки узагальнено. Це запобігає непоміченому ігноруванню ненавмисних помилок.
- Надайте інформативні повідомлення: При перехопленні винятків обов'язково надайте інформативні та зрозумілі користувачеві повідомлення про помилки.
- Використовуйте Finally для очищення: Використовуйте блок finally для того, щоб переконатися, що дії з очищення виконуються, такі як закриття файлів або звільнення ресурсів, незалежно від того, чи виняток був перехоплений чи ні.
Примітка: Важливо знайти баланс між перехопленням конкретних винятків та уникненням надто деталізованої обробки помилок, яка може зробити код громіздким та важким для підтримки.
Пишіть разом із нами!
Ви можете зробити свій внесок у статті про Python на GitHub: створіть Fork, внесіть правки та надішліть нам Pull request.
Обробка помилок та винятків
Під час програмування на Python ми можемо зіткнутися з двома типами помилок. Перший тип представляють синтаксичні помилки (syntax error). сама може відстежувати синтаксичні помилки та якимось чином їх виділяти.
Другий тип помилок являють собою помилки виконання (runtime error). Вони з'являються в процесі виконання програми.
string = "5" number = int(string) print(number)
Цей скрипт успішно виконається, тому що рядок "5" цілком може бути конвертований у число. Однак візьмемо інший приклад:
string = "hello" number = int(string) print(number)
При виконанні цього скрипту буде викинуто виключення ValueError, оскільки рядок "hello" не можна перетворити на число:
ValueError: invalid literal for int() with base 10: 'hello'
З одного боку, тут очевидно, що рядок не є числом, але ми можемо мати справу з введенням користувача, який також може ввести не зовсім те, що ми очікуємо:
string = input("Введіть число: ") number = int(string) print(number)
При виникненні виключення робота програми переривається, і щоб уникнути подібної поведінки та обробляти винятки в Python є конструкція try..except.
try..except
Конструкція try..except має таке формальне визначення:
try: інструкції except [Тип_виключення]: інструкції
Весь основний код, в якому потенційно може виникнути виняток, міститься після ключового слова try . Якщо в цьому коді генерується виняток, робота коду в блоці try переривається, і виконання переходить в блок except .
Після ключового слова except опціонально можна вказати, який виняток буде оброблятись (наприклад, ValueError або KeyError). Після слова except на наступному стоку йдуть інструкції блоку except, що виконуються у разі виключення.
Розглянемо обробку виключення на прикладі перетворення рядка в число:
try: number = int(input("Введіть число: ")) print("Введене число:", number) except: print("Перетворення пройшло невдало") print("Завершення програми")
Введіть число: hello Перетворення пройшло невдало Завершення програми
Як видно з консольного виведення, при введенні рядка виведення числа на консоль не відбувається, а виконання програми переходить до блоку except.
Вводимо правильне число:
Введіть число: 22 Введене число: 22 Завершення програми
Тепер все виконується нормально, виняток не виникає, і відповідно блок except не виконується.
Блок finally
При обробці винятків можна використовувати необов'язковий блок finally . Відмінною особливістю цього блоку є те, що він виконується незалежно, чи було згенеровано виняток:
try: number = int(input("Введіть число: ")) print("Введене число:", number) except: print("Перетворення пройшло невдало") finally: print("Блок try завершив виконання") print("Завершення програми")
Як правило, блок finally застосовується для звільнення ресурсів, що використовуються, наприклад, для закриття файлів.
Варто зазначити, що блок finally не обробляє винятки, і якщо ми використовуємо цей блок без блоку except, то при виникненні помилки додаток аварійно завершиться, як у наступному випадку при розподілі числа на нуль:
try: number = 3/0 # генерує виняток ZeroDivisionError print(number) finally: print("Блок try завершив виконання") print("Завершення програми")