python try except python handling exception with examples
Цей посібник пояснює обробку винятків у Python за допомогою блоку Try Except за допомогою прикладів програмування:
Два типи помилок можуть спричинити різку зупинку програми Python, тобто Помилки синтаксису , і Винятки . У цьому підручнику ми обговоримо другий тип помилок (Винятки) за кількома важливими темами.
Ми отримаємо багато користі від обробки винятків у нашому додатку, таких як:
- Створення надійної програми.
- Створення чистого коду без помилок.
=> Завітайте сюди, щоб ознайомитись із ексклюзивними навчальними посібниками з навчання Python
Що ви дізнаєтесь:
- Python Спробуйте крім
- Поширені винятки Python
- Висновок
Python Спробуйте крім
Однією доброю новиною є те, що Python має велику кількість вбудованих винятків для виявлення помилок у нашому коді. Крім того, це дає нам можливість створювати власні винятки, коли жоден вбудований виняток не відповідає нашим потребам.
Що є винятком
То що є винятком у Python? Ну, простіше кажучи, щоразу, коли інтерпретатор Python намагається виконати недійсний код, він створює виняток, і у випадках, коли такий виняток не обробляється, він порушує звичайний потік інструкцій програми та друкує зворотний зв'язок.
Давайте створимо недійсний код і подивимося, як реагуватиме інтерпретатор Python.
Відкрийте оболонку Python і запустіть наступний код.
>>> 50/0Це одна з найпоширеніших помилок у програмуванні. Наведений вище код намагається розділити число п'ятдесят від 0 (нуль). Інтерпретатор Python розглядає це як недійсну операцію і викликає a ZeroDivisionError , порушує роботу програми та друкує зворотний зв'язок.

Ми це чітко бачимо ZeroDivisionError є винятком, який було порушено. Це справді власний спосіб Python сказати нам, що не круто ділити число на нуль. Хоча іншими мовами, як JavaScript, це не помилка; а python суворо забороняє цю практику.
Крім того, важливо знати, що це лише об’єкт виключення, і в Python вбудовано багато таких об’єктів. Перевірте цього офіційного представника Python документація щоб побачити всі вбудовані винятки Python.
Розуміння Traceback
Перш ніж ми займемось обробкою винятків, я думаю, це допоможе зрозуміти, що саме станеться, якщо винятки не оброблятимуться, і як Python робить все можливе, щоб повідомити нас про нашу помилку.
Щоразу, коли Python зустрічає помилку, виникає виняток. Якщо цей виняток не обробляється, він створює деяку інформацію, яка називається Traceback. Отже, яку інформацію містить цей відстеження?
Як відкрити JAR-файли з Windows 10
Це містить:
- Повідомлення про помилку, яке повідомляє нам, який виняток було викликано та що сталося до цього винятку.
- Різні номери рядків коду, що спричинили цю помилку. Помилка може бути спричинена послідовністю викликів функції, яка називається a стек дзвінків який ми обговоримо пізніше тут.
Хоча це трохи заплутано, ми обіцяємо, що наступний приклад внесе більше світла в наше розуміння.
Згадаймо відстеження, яке було надруковано з ділення 50 на 0 вище, ми бачимо, що відстеження містить таку інформацію:
- Файл “”: Це повідомляє нам, що цей код запускався з консольного терміналу.
- рядок 1: це повідомляє нам про те, що сталася помилка в цьому номері рядка.
- ZeroDivisionError: ділення на нуль: Це говорить нам про те, який виняток було порушено та що його спричинило.
Давайте спробуємо ще один приклад і, можливо, подивимось, як a стек дзвінків виглядає наче. Відкрийте редактор, введіть код нижче та збережіть як tracebackExp .py
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11 Відкрийте термінал в каталозі, де цей файл знайдено, і запустіть.
python tracebackExp.pyВи побачите такий зворотний зв'язок:

Наведений вище відстеження може здатися заплутаним, але насправді це не так. Піфоністи придумали найкращий спосіб читання зворотного зв'язку, який є в знизу вгору . Отже, давайте використаємо цю мудрість, щоб спробувати зрозуміти, що може запропонувати цей відстеження.
- Найнижче ми отримуємо виняток, який був піднятий, і чому він був піднятий.
- Просуваючись вгору, ми отримуємо ім’я файлу tracebackExp .py, де сталася ця помилка, обчислення, яке спричинило цю помилку, compute = numb / div, функція stack2 та рядок з номером посилання 6, де було проведено це обчислення.
- Просуваючись вгору, ми бачимо, що наша функція stack2 була викликана у функції stack1 у рядку номер 3.
- Переходячи до самого верхнього, ми бачимо, що функціональний стек1 був викликаний у рядку номер 11.< модуль > повідомляє нам, що виконується файл.
Поширені винятки Python
Бібліотека Python визначає надзвичайно багато вбудованих винятків. Ви можете перевірити документацію Python або зателефонувати вбудованому місцеві () функція, як показано нижче:
>>> dir(locals()('__builtins__'))Ми не будемо намагатися розглядати всі ці винятки, але ми побачимо кілька типових винятків, з якими ви, мабуть, зіткнетесь.
# 1) TypeError
Він підвищується, коли операція або функція застосовується до об'єкта невідповідного типу.
Приклад 1
Розглянемо наведену нижче програму. Він приймає дивіденд і дільник, потім обчислює і друкує результат ділення дивіденду на дільник.
def compute_division(): dividend = int(input('Enter the dividend: ')) # cast string to int divisor = input('Enter the divisor: ') # no casting # Compute division result = dividend/divisor # print result print('The result of {}/{} is: {}'.format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division() Ми запитуємо у користувача значення дивіденду та дільника, але ми забуваємо передати значення рядка дільника у ціле число. Отже, ми отримуємо тип дивідендів цілим числом ( інт ), а тип дільника - рядок ( стор ). Тоді ми отримуємо Помилка типу оскільки оператор ділення (/) не оперує рядками.

Вам може бути цікаво знати, що на відміну від Python, Javascript має тип Примусу, який в основному перетворює один із типів операндів на еквівалентне значення типу іншого операнда, коли операнди різного типу.
# 2) ValueError
Це піднімається, коли операція або функція отримує аргумент, який має правильний тип, але невідповідне значення.
Приклад 2
Розглянемо нашу програму в Приклад 1 вище.
Якщо користувач вводить буквено-цифрове значення для дивіденду, як «3a», тоді наша програма підніме виключення ValueError. Це тому, що хоча Python int () метод приймає будь-яке число або рядок і повертає цілочисельний об'єкт, значення рядка не повинно містити літери або будь-яке нечислове значення.

# 3) AttributeError
Цей виняток виникає під час призначення або посилання на атрибут, який не існує.
Приклад 3
Розглянемо програму нижче. Він приймає число і обчислює його квадратний корінь, використовуючи Модуль математики Python
import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input('Compute Square root of: ')) # call function to compute square root Коли користувач вводить число, наша програма намагається використовувати функцію з математичного модуля для обчислення його квадратного кореня, але саме тут, ми зробили помилку. Замість sqrt ми помилково набрали sqr, якого не існує в математичному модулі.

Отже, ми намагалися посилатися на атрибут sqr, який не існує, і призвели до винятку AttributeError. Більшість з нас часто роблять подібні помилки. Отже, ви не самотні.
Обробка винятків за допомогою функції 'За винятком'
Як програміст, одна справа, на яку більшість з нас витратить свій час, - це написання надійного коду, який є стійким. Код, який не порушується через деякі помилки. У Python ми можемо досягти цього, вклавши наші твердження всередину a спробуй - крім заява.
Заява Python Try-Except
Оператор try-osim має таку структуру:
try: #your code goes here except '''Specify exception type(s) here''': #handle exception here Давайте вкладемо код у tracebackExp .py всередині оператора try-osim.
def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print('program continuous') # 15 Запуск цього коду дасть результат

Ось як працює оператор try-osim. Python виконує код у блоці try рядок 7-8 . Якщо невідомого коду не знайдено, тоді код у блоці за винятком рядок 10 пропускається і виконання продовжується.
Але, якщо буде знайдено недійсний код, то виконання негайно зупиняється в блоці try і перевіряє, чи виняток викликає збіг із тим, який ми вказали в операторі osim рядок 9 . Якщо він збігається, тоді блок 'виключення' виконується і продовжується. Якщо цього не стане, програма перерве роботу.
Блок try, як правило, містить код, який може викликати виняток, тоді як блок exclus ловить і обробляє виняток.
Обробка декількох винятків з
Ми можемо обробляти численні винятки як з одним 'крім', так і з декількома 'винятками'. Все залежить від того, як ви хочете обробити кожен виняток.
# 1) Обробка кількох винятків з одним винятком
try: #your code goes here except(Exception1(, Exception2(,...ExceptionN)))): #handle exception here Цей метод застосовується, коли ми підозрюємо, що наш код може спричинити різні винятки, і ми хочемо виконати однакові дії в кожному випадку. Отже, якщо інтерпретатор Python знайде збіг, тоді буде виконаний код, написаний у блоці exclu.
Давайте розглянемо приклад коду Python нижче
перетворити символ на int c ++
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except (IndexError, ZeroDivisionError) as ex: print(ex) У нас є два можливі винятки, які можна було б навести тут, ZeroDivisionError і Помилка IndexError . Якщо виникне будь-який із цих винятків, тоді буде виконано блок 'За виключенням'.
У наведеному вище коді idx = 3, тому idx_ значення стає 0 і значення / idx_ значення підніме ZeroDivisionError

# 2) Обробка кількох винятків з кількома винятками
try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here Якщо ми хотіли б обробляти кожний виняток окремо, тоді це можна зробити.
Розглянемо приклад коду Python нижче
def get_fraction(value, idx): arr = (4,5,2,0) # a list of numbers idx_value = arr(idx) # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print('Fraction is ', result) except IndexError: print('idx of {} is out of range'.format(idx)) except ZeroDivisionError: print('arr({}) is 0. Hence, can't divide by zero'.format(idx)) except Exception as ex: print(ex) print('Not sure what happened so not safe to continue, app will be interrupted') raise ex Тут ми помічаємо, що у останньому операторі за винятком було використано виняток. Це тому, що виняток об’єкта виключення відповідає будь-якому виключенню. З цієї причини він завжди повинен бути останнім, оскільки Python припинить перевірку інших обробників винятків, коли один з них збігнеться.
У наведеному вище коді idx = 5 , отже arr (idx) підніме Помилка IndexError тому що idx більше довжини списку обр

Крім того, не впевнений, який виняток було викликано вашою програмою, ніколи не безпечно продовжувати виконання. Ось чому у нас є тип Exception, щоб уловлювати будь-які непередбачувані винятки. Потім ми повідомляємо користувача та перериваємо програму, викликаючи той самий виняток.
Спробуйте Else Statement
Це необов’язкова функція обробки винятків і дозволяє додавати код, який ви хочете запустити, коли помилок не відбулося. Якщо сталася помилка, цей блок else не запускатиметься.
Розглянемо приклад коду Python нижче, відкрийте редактор і збережіть код як elseTry.py
def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input('Enter a divisor: ')) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print('Input can't be zero and should be a valid literal for int(). Please, try again!') else: print('Value: ', value) break Ми отримуємо введення від користувача і використовуємо його для ділення 1. У нас тут є два можливі винятки, це спричинить недійсний ввід користувача ValueError і a нуль (0) що спричинить ZeroDivisionError . У нашому операторі Osim обробляються ці помилки.
Тепер ми хочемо роздрукувати значення значення . Наш else-блок гарантує, що його надрукують, лише якщо наш блок try виконується без помилки. Це важливо, тому що, якщо в нашому блоці спроб виникає помилка, файл значення буде невизначеним. Отже, доступ до нього спричинить ще одну помилку.
Запустіть наведений вище код за допомогою Python elseTry.py

Вихідні дані показують, що для першого введення ми ввели 0 і натисніть ENTER. Оскільки наш дільник отримав 0, 1 / дільник піднято zeroDivisionError . Нашим другим входом було k, яке недійсне для інт (), звідси виняток ValueError піднімається.
Але наш останній вхід був 9, що є дійсним, і в результаті ми отримали значення “ значення ”Надруковано як 0,1111111111111111
Спробуйте нарешті заяву
Це також необов’язкова функція обробки винятків і завжди працюватиме незалежно від того, що відбувається в обробниках винятків.
Це:
- Незалежно від того, відбувається виняток чи ні
- Навіть якщо в інших блоках викликається «return».
- Навіть якщо сценарій завершено в інших блоках
Отже, якщо у нас є код, який ми хочемо запускати в будь-яких ситуаціях, нарешті, block - це наш хлопець. Цей блок в основному використовується для очищення, наприклад закриття файлів.
Розглянемо приклад коду Python нижче
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print('Cleaning...') openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath) Цей код намагається відкрити та прочитати файл text.txt у поточному каталозі. Якщо файл існує, наша програма надрукує перший рядок файлу, тоді наш файл нарешті запуститься і закриє файл.
Скажімо, у нас є файл, який називається text.txt, в каталозі, де знаходиться цей файл програми, і він містить Hello. Якщо ми запустимо програму, ми отримаємо результат

Цей приклад було обрано навмисно, тому що я хотів, щоб ми вирішили невелику проблему, яка може виникнути при закритті файлів у блоці нарешті.
Якщо файл не існує, виняток FileNotFoundError буде піднято і змінна відкрити файл не буде визначено та не буде об’єктом файлу. Отже, спроба закрити його в блоці нарешті викликає виняток UnboundLocalError який є підкласом NameError .
Це в основному говорить про те, що ми намагаємося посилатися на змінну відкрити файл до його призначення.

Маленька хитрість тут полягає у використанні обробників винятків всередині блоку нарешті.
def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print('Cleaning...') openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath) Якщо наш блок спроб викликає FileNotFoundError, тоді ми отримаємо наступний результат

Підняти виняток
Однією доброю новиною про винятки Python є те, що ми можемо навмисно їх підняти. Винятки виникають із заява про підвищення .
Оператор rise має такий синтаксис:
raise (ExceptionName((*args: Object)))Відкрийте термінал і підніміть будь-який об'єкт виключення з Вбудовані винятки Python. Наприклад, якщо ми піднімаємо ZeroDivisionError:
питання автоматичного тестування співбесіди для досвідчених
>>> raise ZeroDivisionError('Can't divide by zero')Ми отримаємо відстеження:

Отже, чому важливо застосовувати винятки?
- Під час роботи зі спеціальними винятками.
- Під час перевірки осудності.
Спеціальні класи винятків
Спеціальним винятком є той, який ви створюєте для обробки помилок, які відповідають вашим потребам. Фокус у тому, що ми визначаємо клас, який походить від об’єкта Виняток , тоді ми використовуємо оператор rise, щоб підняти наш клас винятків.
Припустимо, ми хочемо перевірити введені користувачем дані та переконатися, що введене значення не є від’ємним (перевірка розумності). Звичайно, ми могли б викликати виняток Python ValueError, але ми хотіли б налаштувати помилку, давши їй конкретну і зрозумілу назву, як InputIsNegativeError . Але цей виняток не є вбудованим у Python винятком.
Отже, спочатку ми створюємо наш базовий клас, який буде похідним від Exception.
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass Потім ми створюємо наш клас винятків, який успадкує базовий клас і буде обробляти нашу конкретну помилку.
class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass Давайте перевіримо це
try: value = int(input()) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative') Вищезазначений запит коду на введення користувачем і перевірте, чи не є він негативним. Якщо істина, це викликає наш власний виняток InputIsNegativeError, який пізніше виявляється в операторі изключення.
Нижче наведено повний код:
class CustomError(Exception): 'Base class exception for all exceptions of this module' pass class InputIsNegativeError(CustomError): '''Raised when User enters a negative value''' pass if __name__ == '__main__': try: value = int(input('Input a number: ')) if value <0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print('Input value shouldn't be negative') Якщо введене значення є від'ємним числом, як -1, тоді ми отримаємо вихідні дані:

Перевірте Python doc для отримання детальної інформації про спеціальні винятки Python.
Часті запитання
Q # 1) Як Python обробляє виняток?
Відповідь: Python обробляє винятки за допомогою заява try-Osim . Код, який може викликати виняток, розміщується і виконується в спробувати заблокувати в той час як крім блоку містить код, який буде обробляти винятки, якщо такі виникнуть.
Q # 2) Що викликає виняток у Python?
Відповідь: Кожного разу, коли інтерпретатор Python зустрічає недійсний код, він створює виняток, який є власним способом Python повідомити нам, що сталося щось несподіване. Ми також можемо навмисно створювати винятки, використовуючи заява про підвищення .
Q # 3) Як Python обробляє кілька винятків?
Відповідь: Python обробляє кілька винятків, використовуючи або один, крім блоку, або кілька, крім блоків.
Для одного блоку винятки передаються у вигляді кортежу: крім (Виняток1, Виняток2, .., ВинятокN) та Python перевіряє збіг справа наліво. У цьому випадку для кожного винятку вживаються однакові дії.
Інший спосіб охопити всі винятки - це залишити назву винятку після ключового слова.
except: # handle all exceptions hereДругий спосіб полягає у використанні блоку excluding для кожного винятку:
except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here Таким чином, ви можете робити окремі дії для кожного винятку.
Q # 4) Чому обробка винятків важлива в Python?
Відповідь: Перевага обробки винятків у Python полягає в тому, що ми можемо створювати надійні, чисті та безпомилкові програми. Ми не хочемо, щоб наш робочий код виходив з ладу через деякі помилки, тому ми обробляємо помилки та постійно працюємо.
Q # 5) Як ігнорувати виняток у Python?
Відповідь: Щоб ігнорувати виняток у Python, використовуйте пройти ключове слово в блоці за винятком. Скажімо, ми хочемо ігнорувати виключення ValueError. Ми зробимо це так:
except ValueError: passЯкщо ви не знаєте, що робите, ігнорувати винятки - погана практика. Принаймні, повідомте користувача про всі потенційні помилки.
Висновок
У цьому посібнику ми розглянули: Винятки Python, Traceback; як обробляти винятки з Спробуйте / Окрім / Інакше / Нарешті блоки, як Підніміть Винятки та, нарешті, як створити власні власні винятки.
Дякуємо за читання!
=> Завітайте сюди, щоб вивчити Python з нуля.
Рекомендована література
- Підручник з Python для початківців (практичне БЕЗКОШТОВНЕ навчання з Python)
- Заяви про керування Python (продовження, розрив та передача Python)
- Підручник із прикладами Python DateTime
- Функції рядка Python
- Змінні Python
- Підручник з обробки винятків C # із прикладами коду
- Повне керівництво по обробці винятків PL SQL з прикладами
- Винятки Java та обробка винятків з прикладами