Обробка винятків Python за допомогою оператора try, osim і, нарешті,

У цьому підручнику ви дізнаєтеся, як обробляти винятки у вашій програмі 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()

Цей тип конструкції гарантує, що файл закритий, навіть якщо під час виконання програми виникає виняток.

Цікаві статті...