DevGang
Авторизоваться

Как реализовать обработку ошибок в Python с помощью блоков Try-Except

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

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

Предварительные условия

  1. Практические знания программирования Python
  2. Python установлен в вашей системе
  3. Редактор кода
  4. Желание учиться и экспериментировать с обработкой ошибок 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.
  • Сообщение об ошибке должно быть легко понятным.
  • Создавайте исключения с умом.

Источник:

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу