Когда мы пишем программу на языке 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
.
Перейти в телеграм, чтобы получить результаты теста





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