Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
16 Авг 2024
12 мин
2137

Как обрабатывать исключения в Python: try, except, else, finally

Когда мы пишем программу на языке Python, могут возникать разные ошибки, которые влияют на ее работоспособность.

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

Почему появляются исключения и что с ними делать

Важно понимать: исключения в Python — это не только ошибки, но и события, которые могут произойти в процессе выполнения программы при определенных условиях. Ошибки и исключительные ситуации могут возникать в коде по разным причинам: деление на ноль, обращение к несуществующему файлу или другие. В таких случаях интерпретатор Python генерирует объект исключения, который содержит информацию о возникшей ошибке.

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

def divide_numbers(x, y):
try:
return x / y
except ZeroDivisionError:
print("Ошибка: деление на ноль")

divide_numbers(10, 0)

TypeError — это исключение возникает, когда операция применяется к объекту несоответствующего типа.

def add_numbers(x, y):
try:
return x + y
except TypeError:
print("Ошибка: операция сложения не определена для int и str")

add_numbers(5, ‘2’)

Когда появилось исключение, процесс написания программы приостанавливается — программа передает ошибку на уровень выше до тех пор, пока она не обработается. Если ошибка не может обработаться, программа прекратит работу. При этом в консоли выйдет Traceback (трассировка) с подробным описанием ошибки — отчет, в котором можно увидеть последовательность вызовов функций. Такой отчет помогает узнать причину ошибки и найти место, где она произошла.

Для обработки исключений Python-разработчики используют блоки

try-except

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

try

а само исключение обрабатывается в блоках

except

Профессия Python-разработчика востребована сейчас и будет актуальной долгие годы. На старте такой специалист может получать 50 000 ₽ — 70 000 ₽. А медианная зарплата опытных разработчиков, согласно GetMatch, — 200 000 ₽.

В онлайн-университете Skypro вы получите знания и реальные навыки, которые помогут устроиться на первую работу по новой специальности.

Блоки try-except для обработки исключения

Конструкцию

try

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

Сначала интерпретатор Python начинает выполнение кода внутри блока

try

. Если внутри него не возникает ошибки, код выполняется последовательно до конца блока

try 

.

Если внутри блока

try

возникает исключение, выполнение кода прерывается. Интерпретатор Python ищет соответствующий блок

except

который может обработать это исключение.

Если подходящий блок

except

найден, код в нём выполняется. После этого выполнение продолжается далее за конструкцией

try-except

.

Если нет подходящего блока

except

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

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

try-except

.

def read_and_process_file(filename):
try:
# Попытка открыть файл для чтения
with open(filename, 'r') as file:
# Чтение содержимого файла
content = file.read()
# Предположим, что здесь выполняются какие-то операции с содержимым файла
processed_content = content.upper()
return processed_content
except FileNotFoundError:
# Если файл не найден, выводим сообщение об ошибке
print(f"Файл '{filename}' не найден!")
except IOError:
# Если возникает ошибка ввода-вывода, выводим сообщение об ошибке
print("Произошла ошибка ввода-вывода при чтении файла!")
except Exception as e:
# Обработка других неожиданных исключений
print(f"Произошла неожиданная ошибка: {e}")

# Пример использования функции
filename = "example.txt"
result = read_and_process_file(filename)
if result:
print("Содержимое файла, обработанное функцией:")
print(result)

В этом примере:

🟢 Пробуем открыть файл для чтения с помощью

open()

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

(FileNotFoundError)

, получаем сообщение об ошибке.
🟢 Если возникает ошибка ввода-вывода

(IOError)

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

Exception

.

Как сохранить ошибку в переменную: ключевое слово as

Если во время ошибки блок except найден, программа создает переменную, которая хранит информацию об ошибке. Ключевое слово as используют для привязки этой переменной к экземпляру исключения. Он может содержать полезную информацию о типе ошибки и других деталях.

try:
user_input = input("Введите целое число: ")
number = int(user_input)
print("Введенное число:", number)
except ValueError as e:
print("Ошибка:", e)
print("Вы ввели некорректное значение!")

Как выполнить код даже при наличии ошибки: блок finally

Блок

finally

в конструкции

try-except

— это код, который будет выполнен в любом случае, независимо от того, произошло исключение или нет. Блок

finally

выполняется, даже если исключение было уже обработано.

Можно использовать блок

finally

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

try:
# Попытка открыть файл для чтения
file = open("example.txt", "r")
# Чтение содержимого файла
content = file.read()
print("Содержимое файла:", content)
except FileNotFoundError:
print("Файл не найден!")
finally:
# Блок finally гарантирует, что файл будет закрыт
file.close()
print("Файл закрыт")

В этом примере блок

finally

гарантирует, что файл закроется с помощью

close()

Это важно, чтобы избежать утечки ресурсов и поддерживать корректную работу программы.

Что делать, если код внутри блока try не вызвал исключения: блок else

Блок

else

используют, чтобы выполнить код в случае отсутствия исключений в блоке

try

. Если в

try

произошло исключение, код в

else

выполняться не будет. Если файл успешно открылся и операции выполнились без ошибок, то блок

else

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

try:
# Попытка открыть файл для чтения
file = open("example.txt", "r")
except FileNotFoundError:
print("Файл не найден!")
else:
# Блок else выполняется, если файл успешно открыт и исключений не возникло
content = file.read()
print("Содержимое файла:", content)
file.close()

Если открытие файла прошло успешно и исключений не возникло, код в блоке

else

выполняется. Можно прочесть содержимое файла и вывести его, а затем закрыть. Блок

else

делает код более читаемым и понятным.

Освоить язык Python на уверенном уровне можно в онлайн-университете Skypro. За 10 месяцев научитесь писать код с нуля, даже если у вас нет технического образования. Узнаете, как разрабатывать логику программ, создавать базы данных и автоматизировать их работу, а еще научитесь работать с необходимыми инструментами: Colab, PyCharm, GitHub, Swagger, Django, SQLite, PostgreSQL и другими.

Как создать несколько блоков except

Чтобы создать несколько блоков except, можно просто добавить их после основного блока

try

. При этом каждый

except

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

try:
# Попытка выполнить операцию, которая может вызвать исключение
x = int(input("Введите число: "))
result = 10 / x
print("Результат деления:", result)
except ZeroDivisionError:
# Обработка ошибки, если произошло деление на ноль
print("Ошибка: деление на ноль!")
except ValueError:
# Обработка ошибки, если введенное значение не является числом
print("Ошибка: введенное значение не является числом!")
except Exception as e:
# Обработка других неожиданных исключений
print("Произошла неожиданная ошибка:", e)

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

ZeroDivisionError

Если пользователь вводит нечисловое значение, возникает исключение

ValueError

.
Если возникает какое-то другое неожиданное исключение, оно будет перехвачено блоком

except Exception as e

. Каждый блок

except

обрабатывает свой тип исключения и выводит соответствующее сообщение об ошибке.

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

try:
x = int(input("Введите число: "))
result = 10 / x
print("Результат деления:", result)
except (ZeroDivisionError, ValueError):
print("Ошибка: введенное значение не является допустимым числом или произошло деление на ноль!")

Как генерировать исключения самостоятельно

Если нужно сгенерировать исключение самостоятельно, поможет оператор

raise

. Он вызывает исключение в любом месте кода.

def check_age(age):
if age < 0:
raise ValueError("Возраст не может быть отрицательным числом")
elif age < 18:
raise ValueError("Вы должны быть старше 18 лет для доступа к этому ресурсу")
else:
print("Доступ разрешен")

# Пример использования
try:
check_age(-5)
except ValueError as e:
print("Ошибка:", e)

В этом примере функция

check_age

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

ValueError

с соответствующим сообщением об ошибке. В блоке

except

перехватываем это исключение и выводим сообщение об ошибке.

Кроме того, с помощью

raise

исключение можно обработать в блоке

except

и затем оно бросится дальше вверх по стеку.

def calculate_salary(salary):
try:
if salary < 0:
raise ValueError("Зарплата не может быть отрицательной")
except ValueError:
print("Ошибка: Зарплата не может быть отрицательной")
raise

# Пример использования
try:
calculate_salary(-500)
except ValueError:
print("Произошла ошибка при расчете зарплаты")
raise

Функция

calculate_salary

проверяет зарплату. Если она отрицательная, функция вызывает исключение

ValueError

. Затем в блоке

except

это исключение обрабатывается и выводится сообщение об ошибке. После этого нужно снова вызвать

raise

Как пропустить ошибку

Бывают ситуации, когда ошибку не нужно обрабатывать. Для этого после блока except применяют оператор pass.

try:
a = 5 / 0
except ZeroDivisionError:
pass

Типы встроенных исключений в Python

Все исключения в Python идут от базового

BaseException
Exception

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

SystemExit

,

KeyboardInterrupt
GeneratorExit

— системные исключения, которые не рекомендуется обрабатывать.

От

Exception

идут другие встроенные исключения.

🔵

StopIteration

генерируется встроенной функцией

next()

и указывает, что итератор исчерпал все свои значения. Используется в цикле for, чтобы указать на завершение итерации.

🔵

ArithmeticError

— это базовый класс для всех исключений, связанных с арифметическими операциями. Обычно он не вызывается напрямую, но имеет несколько подклассов:

🟢

FloatingPointError

возникает при ошибке с плавающей точкой.

🟢

OverflowError

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

🟢

ZeroDivisionError

возникает при попытке деления на ноль.

Кроме того, в Exception входят:

🔵

AssertionError

— возникает, когда используемое в функции assert неверно.

🔵

AttributeError

— возникает, если у объекта нет нужного атрибута.

🔵

BufferError

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

🔵

EOFError

— появляется во время ошибки чтения файла.

🔵

ImportError

— возникает из-за ошибки импортирования модуля.

🔵

LookupError

— возникает, когда программа не может найти запрашиваемый элемент в контейнере или обратиться к нему. Бывает двух типов. IndexError — когда программа пытается обратиться к элементу списка по индексу, который находится за пределами размера списка. KeyError — когда программа пытается обратиться к значению по ключу, который отсутствует.

🔵

MemoryError

— возникает, когда в ходе выполнения программы заканчивается доступная память.

🔵

NameError

— возникает, когда программа обращается к имени, которое не определено в текущем контексте. Например, если переменная или функция вызывается до того, как они были определены.

🔵

OSError

— возникает при различных системных ошибках ввода-вывода. Это базовый класс для разных исключений: например,

FileNotFoundError

— файл не существует,

PermissionError

— недостаточно прав доступа или

TimeoutError

— истекло время ожидания.

🔵

SyntaxError

— возникает при синтаксических ошибках в коде, когда Python не может интерпретировать его правильно.

🔵

TypeError

— вызывается, когда операция применяется к объекту несоответствующего типа.

🔵

ValueError

— возникает, когда функция получает аргумент правильного типа, но с неправильным значением.

🔵

Warning

— некритичная ошибка.

Подробное описание встроенных исключений в Python можно изучить в официальной документации.

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

Главное о том, как обрабатывать исключения
🟡 Исключения в Python — это события, которые возникают в процессе выполнения программы при определенных условиях. Например, деление на ноль или обращение к несуществующему файлу. Каждое исключение представляет собой объект, который содержит информацию о возникшей ошибке, — например,

ZeroDivisionError

возникает при попытке деления на ноль.

🟡 Для обработки исключений используют блоки

try-except

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

try

, а само исключение обрабатывается в блоках

except

.

🟡 Ключевое слово

as

помогает сохранить ошибку в переменную, а блок

finally

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

else

. Чтобы сгенерировать исключения самостоятельно, нужен оператор

raise

.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий