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