У цьому підручнику ви дізнаєтеся, як обробляти винятки у вашій програмі Python, використовуючи оператори try, освен і, нарешті, за допомогою прикладів.
Відео: Обробка винятків Python (спробуйте… окрім… нарешті)
Винятки в Python
Python має багато вбудованих винятків, які виникають, коли у вашій програмі виникає помилка (щось у програмі йде не так).
Коли виникають ці винятки, інтерпретатор Python зупиняє поточний процес і передає його процесу виклику, доки він не буде оброблений. Якщо з нею не працювати, програма вийде з ладу.
Наприклад, давайте розглянемо програму, де ми маємо функцію, A
яка викликає функцію B
, яка, у свою чергу, викликає функцію C
. Якщо виняток виникає у функції, C
але не обробляється C
, виняток переходить до, B
а потім до A
.
Якщо ніколи не обробити, відображається повідомлення про помилку, і наша програма раптово зупиняється.
Виловлювання винятків у Python
У Python винятки можна обробляти за допомогою try
оператора.
Критична операція, яка може спричинити виняток, розміщується всередині try
речення. Код, який обробляє винятки, записаний у except
пункті.
Таким чином, ми можемо вибрати, які операції виконувати, коли ми виявили виняток. Ось простий приклад.
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Вихідні дані
Запис на жаль відбулося. Наступний запис. Запис - 0 На жаль трапився. Наступний запис. Запис - 2 Взаємне значення 2 - 0,5
У цій програмі ми прокручуємо значення списку randomList. Як вже згадувалося раніше, частина, яка може спричинити виняток, розміщується всередині try
блоку.
Якщо не відбувається винятку, except
блок пропускається, і нормальний потік продовжується (для останнього значення). Але якщо трапляється будь-який виняток, він фіксується except
блоком (перше і друге значення).
Тут ми друкуємо ім'я винятку за допомогою exc_info()
функції всередині sys
модуля. Ми можемо бачити, що a
причини ValueError
і 0
причини ZeroDivisionError
.
Оскільки кожен виняток у Python успадковується від базового Exception
класу, ми також можемо виконати вищевказане завдання наступним чином:
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Ця програма має той самий результат, що і вищевказана програма.
Вловлювання конкретних винятків у Python
У наведеному вище прикладі ми не згадували жодного конкретного винятку в except
пункті.
Це не є доброю практикою програмування, оскільки вона буде враховувати всі винятки та обробляти всі справи однаково. Ми можемо вказати, які винятки except
слід брати до уваги.
У try
реченні може бути будь-яка кількість except
речень для обробки різних винятків, однак у випадку виникнення винятку буде виконано лише один.
Ми можемо використовувати набір значень, щоб вказати декілька винятків у реченні за винятком. Ось приклад псевдокоду.
try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass
Підвищення винятків у Python
У програмуванні на Python виникають винятки, коли помилки виникають під час виконання. Ми також можемо вручну створювати винятки за допомогою raise
ключового слова.
Ми можемо необов’язково передавати значення винятку, щоб пояснити, чому цей виняток було порушено.
>>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!
Спробуйте Python із реченням else
У деяких ситуаціях може знадобитися запустити певний блок коду, якщо блок коду всередині try
працював без помилок. У цих випадках ви можете використовувати необов’язкове else
ключове слово із try
твердженням.
Примітка : Винятки в реченні else не обробляються попередніми, окрім речень.
Давайте розглянемо приклад:
# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)
Вихідні дані
Якщо ми передаємо непарне число:
Введіть число: 1 Не парне число!
Якщо ми передаємо парне число, взаємне значення обчислюється і відображається.
Введіть число: 4 0,25
Однак, якщо ми передаємо 0, ми отримуємо, ZeroDivisionError
оскільки блок коду всередині else
не обробляється попереднім except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()
Цей тип конструкції гарантує, що файл закритий, навіть якщо під час виконання програми виникає виняток.