Автор оригинала: 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: массивы – визуальное введение для начинающих