Как реализовать обработку ошибок в Python с помощью блоков Try-Except
Ошибки могут как раздражать, так и расстраивать. Часто эти исключения возникают из-за неправильной реализации или использования.
Программистам крайне важно предвидеть исключения и правильно их обрабатывать. На протяжении этого урока мы рассмотрим наиболее распространенные исключения и воспользуемся практическими примерами, чтобы объяснить основы обработки ошибок.
Предварительные условия
- Практические знания программирования Python
- Python установлен в вашей системе
- Редактор кода
- Желание учиться и экспериментировать с обработкой ошибок Python
Основы Try-Except
Блок try-except
используется для обработки исключений. Давайте взглянем на блоки try
и except
и выясним, как они работают.
Блок Try
В блоке try вы помещаете код, который, как вы ожидаете, может вызвать ошибку.
Блок Except
Этот блок обрабатывает исключение.
Try-Except
try:
# Code that may raise an error
except:
# Handle the exception, e.g., print an error message
Обработка различных типов исключений
Блок try
может иметь несколько исключений для обработки определенных ошибок. Вы также можете использовать блок Exception
для обобщения каждой ошибки.
try:
pass
except Exception:
# do something
pass
Также бывают случаи, когда вы хотите напечатать сообщение об ошибке вместо другого сообщения в выходных данных.
try:
result = '5' + 2
print(result)
except TypeError as e:
print('error', e)
Результат в терминале:
error can only concatenate str (not "int") to str
Как узнать, какую конкретную ошибку обрабатывать?
Просто запустите код без обработчика ошибок, какую бы ошибку она ни выдавала в терминале, вы хотите использовать ее в блоке исключений.
Несколько ошибок, с которыми вы можете столкнуться:
- Syntax error
- NameError
- IndexError
- KeyError
- ZeroDivisionError
- TypeError
- ValueError
- ImportError
- FileNotFoundError
- OsError
- AttributeError
Если вы хотите узнать больше об этих ошибках, обратитесь к документации.
Использование определенных типов исключений
Шаг 1: Объединение типов строки и целого числа без блока try-except
.
print('a' + 5)
Результат в терминале:
print('a' + 5)
TypeError: can only concatenate str (not "int") to str
Шаг 2: Теперь, когда мы определили исключение, давайте воспользуемся блоком try-except
.
try:
result = 'a' + 5
print(result)
except TypeError:
print('invalid operation')
Результат в терминале: неверная операция
Использование нескольких блоков исключений
В этом примере у нас есть блок try
, содержащий код, который может вызывать исключения. У нас есть несколько блоков исключений для обработки определенных типов исключений.
try:
# Code that may raise exceptions
num = int(input("Enter a number: "))
result = 10 / num
fruits = ["apple", "banana", "cherry"]
index = int(input("Enter an index to access a fruit: "))
print(f"The selected fruit is: {fruits[index]}")
except ValueError:
# Handle a ValueError (e.g., when user input can't be converted to int)
print("Invalid input. Please enter a valid number.")
except ZeroDivisionError:
# Handle a ZeroDivisionError (e.g., when dividing by zero)
print("Division by zero is not allowed.")
except IndexError:
# Handle an IndexError (e.g., when accessing an index outside the list range)
print("Invalid index. Please choose a valid index.")
except Exception as e:
# Handle other exceptions not explicitly caught above
print(f"An error occurred: {e}")
Блок else
Блок else полезен для выполнения кода при отсутствии исключений, предоставляя способ отделить обычный поток кода от логики обработки исключений.
try:
# Code that may or may not raise an exception
num1 = int(input("Enter the first number: "))
num2 = int(input("Enter the second number: "))
result = num1 / num2
except ZeroDivisionError:
# Handle division by zero exception
print("Division by zero is not allowed.")
except ValueError:
# Handle invalid input (non-integer) exception
print("Invalid input. Please enter valid numbers.")
else:
# Code to execute if no exceptions are raised
print(f"The result of the division is: {result}")
Использование блока «finally» для очистки
Независимо от того, возникло исключение или нет, код внутри блока finally
выполняется.
Это можно использовать для закрытия файлов или сетевых подключений.
try:
# Code that may or may not raise an exception
file = open("example.txt", "r")
data = file.read()
except FileNotFoundError:
# Handle file not found exception
print("File not found.")
except Exception as e:
# Handle other exceptions
print(f"An error occurred: {e}")
finally:
# Code that always executes, regardless of exceptions
print("Cleaning up resources...")
file.close() # Close the file to release resources
Пользовательская обработка исключений
Вызов исключений с помощью ключевого слова «raise»
Вызов исключений важен для сигнализации ошибок и исключительных условий в вашем коде.
def some_function():
# Some condition that warrants raising an exception
raise Exception("This is a custom exception message.")
try:
some_function()
except Exception as e:
print(f"Exception caught: {e}")
Пример: Представьте, что вы пишете программу, которая вычисляет квадратный корень числа, предоставленного пользователем. Вы хотите убедиться, что пользователь вводит допустимое положительное число, поскольку квадратный корень из отрицательных чисел не определен в действительной системе счисления.
import math
def calculate_square_root(number):
if number < 0:
raise ValueError("Invalid input: Please enter a positive number.")
return math.sqrt(number)
try:
user_input = float(input("Enter a number: "))
result = calculate_square_root(user_input)
print(f"The square root of {user_input} is {result}")
except ValueError as e:
print(f"Error: {e}")
Вывод терминала:
Result 1:
Enter a number: -2
Error: Invalid input: Please enter a positive number.
Result 2:
Enter a number: re
Error: could not convert string to float: 're'
Упражнение
В программировании вы можете ознакомиться с этими концепциями только на практике, поискать информацию в Интернете и попробовать что-то. Для исключений, которые не были рассмотрены в этой статье, намеренно создайте некоторые проблемы. Например, если бы это была синтаксическая ошибка, вы могли бы написать функцию без двоеточия или переменную без знака равенства. Для NameError
вы можете распечатать имя несуществующей переменной. В случае importError
вы можете попробовать импортировать несуществующий модуль.
Ошибки, которых следует избегать при обработке исключений
- Сообщение об ошибке должно быть конкретным и легко понятным.
try:
user_input = int(input('Enter a number: '))
except ValueError as e:
print('An error has occurred')
Почему это проблема?
Какая ошибка произошла? Это сообщение сбивает с толку как пользователя, так и разработчика. Представьте, что это программа с несколькими тысячами строк кода, и вы пытаетесь ее отладить. Подобные сообщения усложняют отладку. Представьте пользователя, использующего эту программу. Они будут разочарованы, потому что сообщение об ошибке не объясняет четко, что они сделали не так.
Лучший способ написать это:
try:
user_input = int(input('Enter a number: '))
except ValueError as e:
print('Enter a valid integer')
print(e)
- Использование исключений для управления ходом программы. Например, используя исключения для логики
if-else
.
try:
result = num / 2
if num <= 0:
raise ValueError(f'{num} must be greater than zero')
print(result)
except ValueError as e:
print(e)
Почему это проблема?
Простой блок if-else
решил бы эту проблему. Всегда помните, что простота предпочтительнее написания сложного кода.
Лучший способ написать это:
num = 5
if num > 0:
print(num / 2)
else:
print(f'{num} must be greater than zero')
- Размещение больших разделов кода в блоке
try
.
try:
num1 = int(input("Enter the first number: "))
num2 = int(input("Enter the second number: "))
result = num1 / num2
with open("sample1.txt", "r") as file:
content = file.read()
except Exception as e:
print(f"An error occurred: {e}")
Почему это проблема?
Вы получили пользовательский ввод и выполнили деление, и это нормально. Открытие файла внутри блока try
неверно. Лучшим подходом было бы удалить код, открывающий файл.
Заключение
Из этого урока мы можем сделать следующий вывод:
- Обработка исключений предотвращает неожиданный сбой вашей программы.
- Мы можем использовать несколько блоков
except
. - Сообщение об ошибке должно быть легко понятным.
- Создавайте исключения с умом.