Python Try Except е конструкция, използвана в Python за елегантно обработване на изключения, без да се срива.
Обработката на изключения прави вашия програмен код по-надежден и по-малко вероятно да се провали. Тази статия ръководи обработката на изключения и често срещаните сценарии, при които обработката на изключения е идеална. Като бонус ще разгледаме и как да създаваме изключения.
Съдържание
Какво е обработка на изключения?
Изключения са критични аномалии и грешки, които възникват по време на изпълнение на програмата. Ако не бъдат обработени, изключенията ще сринат програмата. Следователно обработката на изключения е начин за обработка на изключения, за да се гарантира, че те няма да сринат програмата.
Ето един пример, който илюстрира какво е изключение.
user_input = input("Enter a number: ") num = int(user_input) print("Your number doubled is:", num * 2)
На пръв поглед изглежда, че няма нищо лошо в горната програма. Той получава вход от потребителя и го преобразува в цяло число. След това показва удвоеното цяло число, предоставено от потребителя.
Програмата работи добре, ако я стартирате с входна стойност 5. Вижте по-долу.
Но да предположим, че стартирате същата програма отново. Само че този път, вместо да използвате 5 като вход, въвеждате низа „здравей“. Програмата ще се срине. Низът „здравей“ не може да бъде преобразуван в цяло число, така че се предизвиква изключение и програмата се срива.
Защо се повдигат изключения и защо трябва да се справите с тях?
Има изключения, защото често разлагаме програмите на функции, когато ги кодираме. След това тези функции се извикват за изпълнение на различни задачи.
В примера по-горе извикахме функцията за въвеждане, за да получим въведеното от потребителя, след това извикахме функцията int, за да преобразуваме входния низ в цяло число, и накрая извикахме функцията за печат, за да покаже някакъв изход.
Въпреки това, докато функциите изпълняват своите действия, те могат да срещнат грешки, с които не знаят как да се справят. В този случай споменатите функции трябва да спрат да работят и да съобщят, че е възникнала грешка. За да комуникират, те ще направят изключения.
Кодът, който се нарича функция, е отговорен за слушането на тези изключения и реагирането по подходящ начин. Ако това не бъде направено, програмата ще се срине, след като срещне грешки, както видяхме в по-ранния пример.
Следователно изключенията по същество са комуникационен механизъм, който позволява на извикана функция да изпрати сигнал за бедствие към кода, който я е извикал. А подходящото реагиране, споменато по-рано, е същността на обработката на изключения.
Различни видове изключения
Важно е да знаете, че не всички изключения са еднакви. Има различни видове изключения, повдигнати за различни възникнали грешки. Например, ако се опитате да разделите число на нула, се появява ZeroDivisionError. И TypeError се повдига, когато се опитате да извършите операция с невалиден тип данни. Ето пълен списък на видове изключения.
Как да се справим с изключения
Както беше обяснено по-рано, изключения са сигналите за бедствие, направени от функции, които извикваме. Ето защо нашият код трябва да слуша тези сигнали за бедствие и да реагира по подходящ начин, когато бъдат прозвучани. За да обработваме изключения по подходящ начин, ние използваме Python Try Except конструкции. Основната структура на конструкцията е следната:
try: # Code to try and run except: # Code to run if an exception is raised finally: # Code to run in the end, whether or not an exception is raised
Както можете да видите, конструкцията се състои от три ключови думи, които са обяснени по-долу:
опитвам
Ключовата дума try маркира началото на Python Try Except конструкция. В допълнение, той маркира блок от код, който потенциално може да предизвика изключение. Това е инструкция към интерпретатора на Python да се опита да изпълни код в блока. Ако бъде повдигнато изключение, програмата спира незабавно и скача, за да изпълни кода, написан в блока за изключение.
с изключение
Ключовата дума Except маркира блока от код, който ще бъде изпълнен, ако бъде повдигнато изключение по време на изпълнението на блока try. Можете да дефинирате множество блокове с изключения за различни типове изключения, които могат да бъдат повдигнати. Това ще бъде илюстрирано по-късно.
накрая
Ключовата дума finally е третата и последна ключова дума, използвана в Python Try Except. Той маркира блок от код, който ще бъде изпълнен независимо дали е повдигнато изключение или не.
Пример
Ето пример за това как ключовите думи по-горе могат да се справят с изключение. Ще модифицираме предишния пример към това.
try: user_input = input("Enter a number: ") num = int(user_input) print("Your number doubled is:", num * 2) except: print("Something went wrong") finally: print("This code will be executed no matter what")
Ако изпълните горния код с 5, валиден вход, като ваш вход, ще получите следното:
И ако го стартирате с „здравей“ като вход, ще получите следното:
Така че, когато не беше повдигнато изключение при изпълнение на код в блока try, компютърът премина към блока finally. Въпреки това, когато е възникнало изключение по време на изпълнение на код в блока try, компютърът се е преместил в блока на изключение и след това в блока finally.
Можете също така да обработвате изключения за специфични видове грешки. Например, ако искате да обработвате ValueError и KeyboardInterrupt изключения по специфичен начин, можете да промените горния код така:
try: user_input = input("Enter a number: ") num = int(user_input) print("Your number doubled is:", num * 2) except ValueError: print("Value can't be converted to int") except KeyboardInterrupt: print("Received a keyboard interrupt") except: print("Catch-all exception block") finally: print("This code will be executed no matter what")
В кода по-горе имаме 3 блока с изключение. Първият блок освен хваща само изключения ValueError, докато вторият хваща само изключения KeyboardInterrupt. Последният блок с изключение няма асоцииран тип изключение, който да се слуша. В резултат на това той улавя остатъците от изключения, които не са уловени от първите два блока.
Изпълнявайки горния код, трябва да получите изход, подобен на този:
Когато се повдигне изключение, можете да получите повече информация за изключението в обекта за изключение. За да получите достъп до обекта за изключение, използвате ключовата дума as. Използва се както следва:
try: user_input = input("Enter a number: ") num = int(user_input) print("Your number doubled is:", num * 2) except ValueError as e: print("Value Error:", e) except KeyboardInterrupt as e: print("Keyboard Interrupt:", e) except Exception as e: print("Some other exception", e)
Как да създаваме изключения
Досега се занимавахме с изключения, породени от други функции. Въпреки това е възможно също да повдигнете изключения във вашия код. За да предизвикаме изключение, използваме ключовата дума raise. Ние също така определяме клас, който представя какъв тип изключение искаме да повдигнем и четливото за хората съобщение, свързано с изключението.
Използваме класа Exception в следващия пример, за да предизвикаме общо изключение. След това предаваме съобщението на конструктора на класа.
raise Exception('Something went wrong')
Ако изпълните фрагмента по-горе като програма, ще получите резултат, подобен на този:
Можете също да посочите различни видове изключения. Например, можете да предизвикате изключение TypeError, когато дадена стойност има грешен тип данни:
def double(x): if isinstance(x, int): return x * 2 else raise TypeError('x should be an int')
Или ако посочената стойност е извън допустимите граници, можете да повдигнете ValueError:
def say_hello(name): if name == '': raise ValueError('Value outside bounds') else: print('Hello', name)
Можете също така да създадете свои типове изключения, като подкласирате класа Exception. Ето един пример:
class InvalidHTTPMethod(Exception): pass
В горния пример създадохме клас InvalidHTTPMethod, който наследява класа Exception. Можем да го използваме по същия начин, както преди, за да предизвикаме изключения:
raise InvalidHTTPMethod('Must be GET or POST')
Обичайни случаи на употреба за обработка на изключения
Обработката на изключения се използва в много сценарии. Предишният пример показа как може да обработва изключения, дължащи се на потребителско въвеждане. Този раздел ще обхване две допълнителни ситуации, при които обработката на изключения е полезна. Това са обработка на изключения в резултат на неуспешни мрежови заявки и обработка на изключения при четене на файлове.
Правене на мрежови заявки
В примера по-долу ние отправяме заявка към Google. Слушаме за изключения, за да се справим с тях. Тези изключения са дефинирани в обекта requests.exceptions.
import requests try: response = requests.get("https://google.com") # Check if the response status code is in the 200-299 range (successful response) if 200 <= response.status_code < 300: print("Request was successful!") else: print(f"Request failed with status code: {response.status_code}") except requests.exceptions.RequestException as e: print(f"RequestException occurred: {e}") except requests.exceptions.ConnectionError as e: print(f"ConnectionError occurred: {e}") except requests.exceptions.Timeout as e: print(f"Timeout occurred: {e}") except requests.exceptions.TooManyRedirects as e: print(f"TooManyRedirects occurred: {e}") except requests.exceptions.HTTPError as e: print(f"HTTPError occurred: {e}") except Exception as e: print(f"An unexpected error occurred: {e}")
Четене на данни от файл
В този последен пример четем данни от файла hello.txt. Ние също обработваме често срещани изключения, които могат да бъдат повдигнати, като например грешката FileNotFound и IOError.
try: with open(file_path, 'r') as file: data = file.read() print("File contents:") print(data) except FileNotFoundError as e: print(f"FileNotFoundError occurred: {e}") except IOError as e: print(f"IOError occurred: {e}") except Exception as e: print(f"An unexpected error occurred: {e}")
Заключение
Тази статия изследва какви са изключенията и защо са повдигнати. Ние също така установихме, че ги обработваме, за да направим кода по-надежден и да предотвратим сривове. И накрая, разгледахме как да обработваме изключения, както и как да повдигаме някои изключения.
След това проверете често срещаните типове грешки на Python и как да ги разрешите.