Python Опитайте с изключение: Обяснено с примери

Python Try Except е конструкция, използвана в Python за елегантно обработване на изключения, без да се срива.

Обработката на изключения прави вашия програмен код по-надежден и по-малко вероятно да се провали. Тази статия ръководи обработката на изключения и често срещаните сценарии, при които обработката на изключения е идеална. Като бонус ще разгледаме и как да създаваме изключения.

Какво е обработка на изключения?

Изключения са критични аномалии и грешки, които възникват по време на изпълнение на програмата. Ако не бъдат обработени, изключенията ще сринат програмата. Следователно обработката на изключения е начин за обработка на изключения, за да се гарантира, че те няма да сринат програмата.

Ето един пример, който илюстрира какво е изключение.

user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)

На пръв поглед изглежда, че няма нищо лошо в горната програма. Той получава вход от потребителя и го преобразува в цяло число. След това показва удвоеното цяло число, предоставено от потребителя.

Програмата работи добре, ако я стартирате с входна стойност 5. Вижте по-долу.

Но да предположим, че стартирате същата програма отново. Само че този път, вместо да използвате 5 като вход, въвеждате низа „здравей“. Програмата ще се срине. Низът „здравей“ не може да бъде преобразуван в цяло число, така че се предизвиква изключение и програмата се срива.

Защо се повдигат изключения и защо трябва да се справите с тях?

Има изключения, защото често разлагаме програмите на функции, когато ги кодираме. След това тези функции се извикват за изпълнение на различни задачи.

В примера по-горе извикахме функцията за въвеждане, за да получим въведеното от потребителя, след това извикахме функцията int, за да преобразуваме входния низ в цяло число, и накрая извикахме функцията за печат, за да покаже някакъв изход.

Въпреки това, докато функциите изпълняват своите действия, те могат да срещнат грешки, с които не знаят как да се справят. В този случай споменатите функции трябва да спрат да работят и да съобщят, че е възникнала грешка. За да комуникират, те ще направят изключения.

  Нови функции в OS X Yosemite

Кодът, който се нарича функция, е отговорен за слушането на тези изключения и реагирането по подходящ начин. Ако това не бъде направено, програмата ще се срине, след като срещне грешки, както видяхме в по-ранния пример.

Следователно изключенията по същество са комуникационен механизъм, който позволява на извикана функция да изпрати сигнал за бедствие към кода, който я е извикал. А подходящото реагиране, споменато по-рано, е същността на обработката на изключения.

Различни видове изключения

Важно е да знаете, че не всички изключения са еднакви. Има различни видове изключения, повдигнати за различни възникнали грешки. Например, ако се опитате да разделите число на нула, се появява 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. Той маркира блок от код, който ще бъде изпълнен независимо дали е повдигнато изключение или не.

  Как да превърнете Raspbery Pi в Plex сървър

Пример

Ето пример за това как ключовите думи по-горе могат да се справят с изключение. Ще модифицираме предишния пример към това.

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')

Ако изпълните фрагмента по-горе като програма, ще получите резултат, подобен на този:

  Как да отпечатате корицата на CD

Можете също да посочите различни видове изключения. Например, можете да предизвикате изключение 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 и как да ги разрешите.