Рубрики
Без рубрики

Как обрабатывать исключения в Python: подробное визуальное введение

Автор оригинала: Estefania Cassingena Navone.

Добро пожаловать! В этой статье вы узнаете, как обращаться с исключениями в Python.

В частности, мы охватим:

  • Исключения
  • Цель обработки исключений
  • True Prose.
  • Крона
  • Остальное предложение
  • Наконец-то оговорка
  • Как поднять исключения

Вы готовы? Давайте начнем! 😀.

1️⃣ вступление в исключения

Начнем с исключения:

  • Что они?
  • Почему они актуальны?
  • Почему Если вы обращаетесь с ними?

Согласно Документация Python :

Исключения поднимаются, когда программа сталкивается с ошибкой во время его выполнения. Они нарушают нормальный поток программы и обычно заканчивают его резко. Чтобы избежать этого, вы можете поймать их и обращаться с ними соответствующим образом.

Вы, наверное, видели их во время ваших проектов программирования.

Если вы когда-либо пытались разделить на ноль в Python, вы должны увидеть это сообщение об ошибке:

>>> a = 5/0
Traceback (most recent call last):
  File "", line 1, in 
    a = 5/0
ZeroDivisionError: division by zero

Если вы попытались индексировать строку с недопустимым индексом, вы определенно получили это сообщение об ошибке:

>>> a = "Hello, World"
>>> a[456]
Traceback (most recent call last):
  File "", line 1, in 
    a[456]
IndexError: string index out of range

Это примеры исключения.

🔹 Общие исключения

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

  • IndexError – поднял, когда вы пытаетесь индексировать список, кортеж или строку за пределами разрешенных границ. Например:
>>> num = [1, 2, 6, 5]
>>> num[56546546]
Traceback (most recent call last):
  File "", line 1, in 
    num[56546546]
IndexError: list index out of range
  • KeyError – поднял, когда вы пытаетесь получить доступ к значению ключа, который не существует в словаре. Например:
>>> students = {"Nora": 15, "Gino": 30}
>>> students["Lisa"]
Traceback (most recent call last):
  File "", line 1, in 
    students["Lisa"]
KeyError: 'Lisa'
  • NameError – поднят, когда имя, которое вы ссылаетесь в код, не существует. Например:
>>> a = b
Traceback (most recent call last):
  File "", line 1, in 
    a = b
NameError: name 'b' is not defined
  • Типеррор – поднят, когда операция или функция применяются к объекту неуместного типа. Например:
>>> (5, 6, 7) * (1, 2, 3)
Traceback (most recent call last):
  File "", line 1, in 
    (5, 6, 7) * (1, 2, 3)
TypeError: can't multiply sequence by non-int of type 'tuple'
  • ZerodivisionError – поднял, когда вы пытаетесь разделить на ноль.
>>> a = 5/0
Traceback (most recent call last):
  File "", line 1, in 
    a = 5/0
ZeroDivisionError: division by zero

💡 Советы: Чтобы узнать больше о других типах встроенных исключений, пожалуйста Обратитесь к этой статье в документации Python.

🔸 анатомия исключения

Я уверен, что вы, должно быть, заметили общий шаблон в этих сообщениях об ошибках. Давайте сломаем их общую структуру кусочками:

Во-первых, мы находим эту строку (см. Ниже). А Traceback в основном список деталей вызовов функций, которые были сделаны до того, как было поднят исключение.

Traceback поможет вам во время процесса отладки, поскольку вы можете проанализировать последовательность функционных вызовов, которые привели к исклюком.

Traceback (most recent call last):

Затем мы видим эту строку (см. Ниже) с пути к файлу и строку, которая подняла исключение. В этом случае путь был Python Shell , поскольку пример был выполнен непосредственно в холостом ходу.

File "", line 1, in 
   a - 5/0

💡 Совет: Если строка, которая подняла исключение, принадлежит функции, <модуль> заменяется названием функции.

Наконец, мы видим описательное сообщение, детализирующее тип исключения и предоставления дополнительной информации, чтобы помочь нам отладить код:

NameError: name 'a' is not defined

2️⃣ Обработка исключений: цель и контекст

Вы можете спросить: почему я хочу справиться с исключениями? Почему это полезно для меня? При обработке исключений вы можете предоставить альтернативный поток выполнения, чтобы не неожиданно разбиться своей программой.

🔹 Пример: ввод пользователя

Представьте себе, что произойдет, если пользователь, который работает с вашей программой, вводит неверный ввод. Это будет поднять исключение, поскольку в процессе выполнялось неверная операция.

Если ваша программа не обрабатывается правильно, она вдруг уходит, и у пользователя будет очень разочаровывающий опыт работы с вашим продуктом.

Но если вы справляетесь с исключением, вы сможете предоставить альтернативу улучшить опыт пользователя.

Возможно, вы можете отобразить описательное сообщение, задающее пользователю вводить действительный вход, или вы можете предоставить значение по умолчанию для ввода. В зависимости от контекста вы можете выбрать, что делать, когда это происходит, и это магия обработки ошибок. Это может спасти день, когда случаются неожиданные вещи. ⭐️.

🔸 Что происходит за кулисами?

В основном, когда мы обрабатываем исключение, мы говорим программу, что делать, если исключение поднимается. В этом случае «альтернативный» поток исполнения придет к спасению. Если исключения не подняты, код будет работать должным образом.

3️⃣ Время в коде: попробуйте … кроме утверждения

Теперь, когда вы знаете, какие исключения и почему вы должны справиться с ними, мы начнем погружение в встроенные инструменты, которые предлагает для этого языки Python.

Во-первых, у нас самое простое утверждение: попробуйте … кроме.

Давайте проиллюстрируем это простым примером. У нас есть эта небольшая программа, которая просит пользователя ввести имя студента, чтобы отобразить его возраст:

students = {"Nora": 15, "Gino": 30}

def print_student_age():
    name = input("Please enter the name of the student: ")
    print(students[name])

print_student_age()

Обратите внимание, как мы не проверяем ввод пользователей в данный момент, поэтому пользователь может ввести недопустимые значения (имена, которые не в словаре), и последствия будут катастрофическими, потому что программа будет сбиваться, если поднят keyError:

# User Input
Please enter the name of the student: "Daniel"

# Error Message
Traceback (most recent call last):
  File "", line 15, in 
    print_student_age()
  File "", line 13, in print_student_age
    print(students[name])
KeyError: '"Daniel"'

🔹 синтаксис

Мы можем справиться с этим красиво, используя попробовать … кроме. Это основной синтаксис:

В нашем примере мы бы добавили попытку … кроме оператора в рамках функции. Давайте сломаемся частью по кусочке:

students = {"Nora": 15, "Gino": 30}

def print_student_age():
    while True:
        try:
            name = input("Please enter the name of the student: ")
            print(students[name])
            break
        except:
            print("This name is not registered")
    

print_student_age()

Если мы «увеличить», мы видим попытку … кроме утверждения:

try:
	name = input("Please enter the name of the student: ")
	print(students[name])
	break
except:
	print("This name is not registered")
  • Когда функция называется, появится предложение TRY. Если исключения не подняты, программа будет работать, как ожидалось.
  • Но если исключение поднимается в пункте TRURY, поток выполнения немедленно перейдет на предложение за исключением, чтобы обработать исключение.

💡 Примечание: Этот код содержится в некотором направлении цикла, чтобы продолжить просить пользовательский ввод, если значение неверно. Это пример:

Please enter the name of the student: "Lulu"
This name is not registered
Please enter the name of the student: 

Это здорово, верно? Теперь мы можем продолжать просить пользовательский ввод, если значение неверно.

На данный момент мы обрабатываем все возможные исключения с одинаковым предложением, кроме. Но что, если мы только хотим справиться только к определенному типу исключения? Давайте посмотрим, как мы могли бы сделать это.

🔸 ловить конкретные исключения

Поскольку не все типы исключений обрабатываются так же, мы можем указать, какие исключения мы хотели бы обрабатывать с этим синтаксисом:

Это пример. Мы обрабатываем исключение ZerodivisionError, если пользователь входит в нулю в качестве знаменателя:

def divide_integers():
    while True:
        try:
            a = int(input("Please enter the numerator: "))
            b = int(input("Please enter the denominator: "))
            print(a / b)
        except ZeroDivisionError:
            print("Please enter a valid denominator.")


divide_integers()

Это будет результатом:

# First iteration
Please enter the numerator: 5
Please enter the denominator: 0
Please enter a valid denominator. 

# Second iteration
Please enter the numerator: 5
Please enter the denominator: 2
2.5

Мы обрабатываем это правильно. Но … если поднят другой тип исключения, программа не будет решать ее изящной.

Здесь у нас есть пример ValueError, потому что один из ценностей – это поплавок, а не INT:

Please enter the numerator: 5
Please enter the denominator: 0.5
Traceback (most recent call last):
  File "", line 53, in 
    divide_integers()
  File "", line 47, in divide_integers
    b = int(input("Please enter the denominator: "))
ValueError: invalid literal for int() with base 10: '0.5'

Мы можем настроить, как мы обрабатываем различные типы исключений.

🔹 Несколько кроме пунктов

Для этого нам нужно добавить несколько кроме Предлагает, чтобы обрабатывать различные типы исключений по-разному.

Согласно Документация Python :

В этом примере у нас есть два кроме положения. Один из них обрабатывает ZerodivisionError и другой ручки ValueError, два типа исключений, которые могут быть подняты в этом блоке.

def divide_integers():
    while True:
        try:
            a = int(input("Please enter the numerator: "))
            b = int(input("Please enter the denominator: "))
            print(a / b)
        except ZeroDivisionError:
            print("Please enter a valid denominator.")
        except ValueError:
            print("Both values have to be integers.")


divide_integers() 

💡 Совет: Вы должны определить, какие типы исключений могут быть подняты в блоке Try, чтобы обработать их соответствующим образом.

🔸 Несколько исключений, Один кроме

Вы также можете обрабатывать разные типы исключений с одинаковым предложением.

Согласно Документация Python :

Это пример, где мы ловим два исключения (ZerodivisionError и ValueError) с тем же кроме пункт:

def divide_integers():
    while True:
        try:
            a = int(input("Please enter the numerator: "))
            b = int(input("Please enter the denominator: "))
            print(a / b)
        except (ZeroDivisionError, ValueError):
            print("Please enter valid integers.")

divide_integers()

Выходность будет одинаковым для двух типов исключений, потому что они обрабатываются одним и тем же предложением, за исключением случаев:

Please enter the numerator: 5
Please enter the denominator: 0
Please enter valid integers.
Please enter the numerator: 0.5
Please enter valid integers.
Please enter the numerator: 

🔹 Обработка исключений, поднятых функциями, называемыми в пункте TRY TRUE

Интересным аспектом обработки исключений является то, что если исключение поднимается в функции, которая ранее была вызвана в пункте Thrue другой функции, и сама функция не обрабатывает его, вызывающий абонент будет обрабатывать его, если будет соответствующий статью.

Согласно Документация Python :

Давайте посмотрим пример, чтобы проиллюстрировать это:

def f(i):
    try:
        g(i)
    except IndexError:
        print("Please enter a valid index")

def g(i):
    a = "Hello"
    return a[i]

f(50)

У нас есть F Функция и G функция. F звонки G в пункте попробовать. С аргументом 50, G будет поднять indexError, потому что индекс 50 недействителен для строки a.

Но G Сама не обрабатывает исключение. Обратите внимание, как нет попробовать … кроме оператора в G функция. Поскольку это не справится с исключением, он «отправляет» это на F Чтобы увидеть, может ли он справиться с этим, как вы можете видеть на диаграмме ниже:

С F делает Знайте, как обрабатывать indexError, ситуация обрабатывается изящно, и это вывод:

Please enter a valid index

💡 Примечание: Если F Не обрабатывали исключение, программа внезапно закончилась с сообщением об ошибке по умолчанию для indexError.

🔸 Доступ к конкретным деталям исключений

Исключения являются объектами в Python, поэтому вы можете назначить исключение, которое было поднято для переменной. Таким образом, вы можете распечатать описание по умолчанию исключение и получить доступ к своим аргументам.

Согласно Документация Python :

Здесь у нас есть пример (см. Ниже), мы присваиваем экземпляр ZerodivisionError к переменной е Отказ Затем мы можем использовать эту переменную в разделе кроме того, чтобы получить доступ к типу исключения, его сообщения и аргументов.

def divide_integers():
    while True:
        try:
            a = int(input("Please enter the numerator: "))
            b = int(input("Please enter the denominator: "))
            print(a / b)
        # Here we assign the exception to the variable e
        except ZeroDivisionError as e:
            print(type(e))
            print(e)
            print(e.args)

divide_integers()

Соответствующий выход:

Please enter the numerator: 5
Please enter the denominator: 0

# Type


# Message
division by zero

# Args
('division by zero',)

💡 Совет: Если вы знакомы со специальными методами, согласно Документация Python : «Для удобства экземпляр исключения определяет __str __ () Итак, аргументы могут быть напечатаны напрямую без необходимости ссылки .args .

4️⃣ Теперь добавим: «else»

еще Пункт является необязательным, но это отличный инструмент, потому что он позволяет нам выполнить код, который должен работать только, если в пункте TRUE не поднялись исключения.

Согласно Документация Python :

Вот пример использования еще пункт:

def divide_integers():
    while True:
        try:
            a = int(input("Please enter the numerator: "))
            b = int(input("Please enter the denominator: "))
            result = a / b
        except (ZeroDivisionError, ValueError):
            print("Please enter valid integers. The denominator can't be zero")
        else:
            print(result)

divide_integers()

Если исключение не поднимается, результат печатается:

Please enter the numerator: 5
Please enter the denominator: 5
1.0

Но если исключение поднят, результат не печатается:

Please enter the numerator: 5
Please enter the denominator: 0
Please enter valid integers. The denominator can't be zero

💡 Совет: Согласно Документация Python :

5️⃣ «Наконец» оговорка

Предложение Наконец – это последнее предложение в этой последовательности. Это Необязательно , но если вы включите его, это должно быть последним предложением в последовательности. Наконец Пункт – это всегда Выполнено, даже если исключение было поднято в пункте TRY.

Согласно Документация Python :

Предложение окончательного предложения обычно используется для выполнения «очистки» действий, которые всегда должны быть завершены. Например, если мы работаем с файлом в пункте True, нам всегда нужно будет закрывать файл, даже если исключение было поднято, когда мы работали с данными.

Вот пример точка зрения, наконец:

def divide_integers():
    while True:
        try:
            a = int(input("Please enter the numerator: "))
            b = int(input("Please enter the denominator: "))
            result = a / b
        except (ZeroDivisionError, ValueError):
            print("Please enter valid integers. The denominator can't be zero")
        else:
            print(result)
        finally:
            print("Inside the finally clause")

divide_integers()

Это вывод, когда не были подняты исключения:

Please enter the numerator: 5
Please enter the denominator: 5
1.0
Inside the finally clause

Это выход, когда был поднят исключение:

Please enter the numerator: 5
Please enter the denominator: 0
Please enter valid integers. The denominator can't be zero
Inside the finally clause

Обратите внимание, как Наконец пункт всегда бежит.

❗️Вспортировать: Помните, что еще пункт и Наконец Пункт является необязательным, но если вы решите включить оба, то, что, наконец, то есть последнее предложение в последовательности.

6️⃣ Восстановление исключений

Теперь, когда вы знаете, как обрабатывать исключения в Python, я хотел бы поделиться с вами этим полезным советом: Вы также можете выбрать, когда поднять исключения в вашем коде.

Это может быть полезно для определенных сценариев. Давайте посмотрим, как вы можете сделать это:

Эта линия поднимет ValueError с пользовательским сообщением.

Здесь у нас есть пример (см. Ниже) функции, которая печатает значение элементов списка или кортежа или символов в строке. Но вы решили, что вы хотите, чтобы список, кортеж или строку быть длиной 5. Вы запускаете функцию с помощью оператора IF, которые проверяют, если длина аргумента данные 5. Если это не так, исключение ValueError поднимается:

def print_five_items(data):
    
    if len(data) != 5:
        raise ValueError("The argument must have five elements")
    
    for item in data:
        print(item)

print_five_items([5, 2])

Вывод будет:

Traceback (most recent call last):
  File "", line 122, in 
    print_five_items([5, 2])
  File "", line 117, in print_five_items
    raise ValueError("The argument must have five elements")
ValueError: The argument must have five elements

Обратите внимание, как последняя строка отображает описательное сообщение:

ValueError: The argument must have five elements

Затем вы можете выбрать, как обрабатывать исключение с попыткой … кроме оператора. Вы можете добавить предложение и/или предложение окончательно. Вы можете настроить его, чтобы соответствовать вашим потребностям.

🔹 Полезные ресурсы

Я надеюсь, что вам понравилось читать мою статью и обнаружил, что это полезно. Теперь у вас есть необходимые инструменты для обработки исключений в Python, и вы можете использовать их в своих интересах, когда вы пишете код Python. ? Проверьте мои онлайн-курсы Отказ Вы можете следовать за мной на Twitter Отказ

⭐️ Вы можете насладиться моими другими статьями FreeCodecamp/News:

  • Декоратор @property в Python: его использование случаев, преимущества и синтаксис
  • Структуры данных 101: Графики – Визуальное введение для начинающих
  • Структуры данных 101: массивы – визуальное введение для начинающих