Обработка исключений в Python

Обработка исключений

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

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

Базовая обработка исключений

Нельзя делить на ноль, это математическая истина, и если вы попытаетесь сделать это в Python, интерпретатор вызовет встроенное исключение ZeroDivisionError:

def divide(dividend , divisor):
    print(dividend / divisor)

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

Предположим, мы не хотим, чтобы наше выполнение программы останавливалось или чтобы пользователю выводился непонятный ему результат. Скажем, мы хотим напечатать полезное и понятное сообщение, тогда нам нужно обработать исключение с помощью ключевых слов try и except:

# try-except: обрабатывать исключения корректно
def divide(dividend , divisor):
    try:  # Попытаться выполнить этот код
        print(dividend / divisor)
    except ZeroDivisionError:  # Перехватить конкретный тип исключения
        print('You can not divide by 0')

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
You can not divide by 0
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Какие ключевые слова используются для обработки исключений в Python?
A. try и except
B. catch и handle
C. error и rescue
D. if и else

Обработка нескольких исключений с помощью одного блока исключений

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

# Обработка нескольких исключений в одном блоке except
def divide(dividend , divisor):
    try:
        if (dividend == 10):
          var = 'str' + 1  # Это вызовет TypeError
        else:
          print(dividend / divisor)
    except (ZeroDivisionError, TypeError) as error:  # Перехват нескольких типов исключений
        print(error)  # Вывод сообщения об ошибке

divide(dividend=20, divisor=5)
4
divide(dividend=10, divisor=5)
can only concatenate str (not "int") to str
divide(dividend=10, divisor=0)
division by zero
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Можно ли обрабатывать несколько типов исключений в одном блоке except?
A. Нет, для каждого типа исключения необходимо использовать отдельные блоки except
B. Да, поместив их в кортеж, например except (Exception1, Exception2)
C. Да, но только если они связаны
D. Нет, Python этого не поддерживает

Код finally при обработке исключений

Код внутри секции finally всегда выполняется, независимо от того, было ли вызвано исключение или нет:

# Блок finally: выполняется всегда, независимо от исключений
def divide(dividend , divisor):
    try:
        print(dividend / divisor)
    except ZeroDivisionError:
        print('You can not divide by 0')
    finally:  # Выполняется всегда, даже если произошло исключение
        print('Execution finished')

divide(dividend=10, divisor=5)
2.0
Execution finished
divide(dividend=10, divisor=0)
You can not divide by 0
Execution finished
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Когда выполняется блок finally?
A. Только когда возникает исключение
B. Только когда исключение не возникает
C. Всегда, независимо от того, произошло исключение или нет
D. Никогда

Пользовательские исключения

Пользовательские исключения инициализируются путем создания class, который наследуется от базового класса Exception Python, и вызываются с помощью ключевого слова raise:

# Пользовательское исключение: создается путем наследования от класса Exception
class MyCustomException(Exception):
    pass

raise MyCustomException  # Вызов пользовательского исключения
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException

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

class MyCustomException(Exception):
    pass

raise MyCustomException('A custom message for my custom exception')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException: A custom message for my custom exception

Обработка пользовательского исключения такая же, как и любой другой:

try:
    raise MyCustomException('A custom message for my custom exception')
except MyCustomException:
    print('My custom exception was raised')
My custom exception was raised
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Как создать пользовательское исключение в Python?
A. Создать класс, который наследуется от класса Exception
B. Использовать декоратор @exception
C. Вызвать Exception.create()
D. Импортировать его из специального модуля

Соответствующие ссылки