Чем полезна обработка ошибок при помощи try-except

Исключения и ошибки — это нежелательные события в программе, которые могут привести к преждевременному завершению ее выполнения. В Python мы выполняем обработку исключений с помощью блоков try-except и finally. Зачем вообще обрабатывать исключения? В этой статье мы на примерах рассмотрим несколько причин.

Обработка ошибок, которые программист не может предсказать

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

Предположим, пользователь нажимает клавиши Ctrl+c или del, чтобы прервать выполнение программы, после чего программа резко завершается из-за ошибки KeyBoardInterrupt. Мы можем обработать эту ошибку, используя try-except. При этом можно показать пользовательское сообщение перед завершением программы или выполнить другие инструкции для сохранения состояния программы в файловой системе. Таким образом мы можем избежать потери данных в случае, если пользователь ненароком нажмет клавиши, прерывающие работу программы.

try:
    dividend=int(input())
    divisor=int(input())
    print("Dividend is:",end=" ")
    print(dividend)
    print("Divisor is:",end=" ")
    print(divisor)
    quotient=dividend/divisor
    print("Quotient is:",end=" ")
    print(quotient)
except (KeyboardInterrupt):
    print("Operation has been cancelled by the user")

Обработка исключений, возникающих во время выполнения

Даже если программа синтаксически корректна и обрабатывает все ограничения, во время выполнения может возникнуть ошибка, не зависящая от логики, реализованной в программе. Например, если файл не найден во время операции чтения файла, программа может столкнуться с ошибкой и преждевременно завершить выполнение. Но аварийного завершения можно избежать благодаря обработке ошибок.

Вы можете обработать и другие типы исключений, возникающих при выполнении программы: ZeroDivisionError, KeyError, NameError, IndexError и т.д.

Например, следующая программа предназначена для деления одного числа на другое. Но если делитель равен нулю, возникает ошибка ZeroDivisionError, и программа завершается:

dividend=10
divisor=0
print("Dividend is:",end=" ")
print(dividend)
print("Divisor is:",end=" ")
print(divisor)
quotient=dividend/divisor
print("Quotient is:",end=" ")
print(quotient)

Вывод:

Dividend is: 10
Divisor is: 0
Traceback (most recent call last):

  File "", line 1, in 
    runfile('/home/aditya1117/untitled0.py', wdir='/home/aditya1117')

  File "/usr/lib/python3/dist-packages/spyder_kernels/customize/spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "/usr/lib/python3/dist-packages/spyder_kernels/customize/spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/aditya1117/untitled0.py", line 9, in 
    quotient=dividend/divisor

ZeroDivisionError: division by zero

Мы можем избежать преждевременного завершения программы, заключив операцию деления в блок try-except, чтобы при возникновении ошибки ZeroDivisionError она автоматически обрабатывалась кодом в блоке except:

dividend=10
divisor=0
print("Dividend is:",end=" ")
print(dividend)
print("Divisor is:",end=" ")
print(divisor)
try:
    quotient=dividend/divisor
    print("Quotient is:",end=" ")
    print(quotient)
except (ZeroDivisionError):
    print("Divisor Cannot be zero") 

Вывод:

Dividend is: 10
Divisor is: 0
Divisor Cannot be zero

Отделение обработки ошибок от бизнес-логики

Используя обработку ошибок try-except, мы можем легко отделить код, который обрабатывает ошибки, от кода, который реализует логику. Благодаря такому разделению код становится более читабельным.

Допустим, мы хотим определить год рождения человека и должны убедиться, что возраст не будет отрицательным. Мы сделаем это с помощью условных операторов if-else:

age= -10
print("Age is:")
print(age)
if age<0:
    print("Input Correct age.")
else:
    yearOfBirth= 2021-age
    print("Year of Birth is:")
    print(yearOfBirth)

Вывод:

Age is:
-10
Input Correct age.

В приведенной выше программе мы проверяем и обрабатываем случай, когда возраст отрицательный, в одном и том же блоке кода. Но мы можем вынести проверку условия в один блок, а обработку ошибки — в другой, используя try-except:

try:
    age= -10
    print("Age is:")
    print(age)
    if age<0:
        raise ValueError
    yearOfBirth= 2021-age
    print("Year of Birth is:")
    print(yearOfBirth)
except ValueError:
    print("Input Correct age.")

Вывод:

Age is:
-10
Input Correct age.

Здесь мы видим, что в блоке try мы проверили неотрицательность возраста, и при отрицательном значении возраста возникает ValueError. Затем ValueError обрабатывается кодом в блоке except для вывода сообщения. Таким образом мы разнесли код проверки условий и код обработки ошибок по разным блокам, что приведет к лучшей читаемости исходного кода.

Распространение ошибок вверх по стеку вызовов

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

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

Например, в приведенном ниже коде ошибка ValueError возникает в функции a(), но код для обработки ValueError написан в функции b(). Когда функция b() вызывает функцию a(), a() передает ошибку в функцию b(), после чего ошибка обрабатывается и выводится сообщение.

def a():
    print("PythonForBeginners in function a")
    raise ValueError
def b():
    try:
        print("PythonForBeginners in function b")
        a()
    except Exception as e:
        print("Caught error from called function in function b")
#call function b
b()

Вывод:

PythonForBeginners in function b
PythonForBeginners in function a
Caught error from called function in function b

Когда в какой-либо функции возникает исключение, которое не обрабатывается в самой функции, интерпретатор Python просматривает стек вызовов функции назад, чтобы проверить, был ли код обработки такой ошибки реализован в какой-либо вызывающей функции. Если текущая функция на каком-либо этапе не имеет соответствующего кода обработки ошибки, ошибка передается в вызывающую функцию, пока не будет найден соответствующий код обработки ошибки или пока мы не достигнем главной функции.

Заключение

В этой статье мы рассмотрели, какие задачи решаются при помощи обработки ошибок с использованием try-except. Мы также вкратце прошлись по теме распространения ошибок в стеке вызовов функций и разобрали, чем это может быть полезно для написания модульного кода.

Перевод статьи Aditya Raj «Why try-except error handling is useful in Python».

7 комментариев к “Чем полезна обработка ошибок при помощи try-except”

  1. Пингбэк: Как преобразовать строку в число с плавающей точкой - pythonturbo

  2. Пингбэк: Как скачать видео с YouTube при помощи Python

  3. Пингбэк: Введение в Python Celery

  4. Пингбэк: Парсинг при помощи Python и Selenium

  5. Пингбэк: Пользовательский ввод и его обработка в Python

  6. Пингбэк: Ключевое слово pass в Python

  7. Frankjeack

    Сайт Kraken – лучший магазин моментальных покупок в Darknet

    Торговая площадка Кракен – лучший магазин в Даркнете, где есть почти любые ПАВ, фальшивые документы и деньги, можно заплатить за взлом сайтов и пробив информации. Покупателям обеспечивается полная анонимность, а число продавцов постоянно увеличивается.

    Покупки на сайте Kraken

    На Кракене встречаются такие предложения:
    • Несколько видов наркотических средств – от марихуаны и стимуляторов до ЛСД и кокаина.
    • Обналичка Биткоинов.
    • Платные подписки ВПН.
    • Цифровые услуги.
    • Паспорта, удостоверения, водительские права.
    • Банковские карты и симки.
    • Фальшивые купюры – обычно – от 1000 до 5000 рублей.
    • Приборы и устрйоства – камеры, жучки, электронные ключи.

    Кракен поможет и найти работу. Например, устроиться закладчиком, варщиком или гровером. Можно стать продавцом.

    Несколько плюсов сайта

    Основные преимущества этого ресурса:
    • Полная анонимность клиентов и владельцев магазинов благодаря расположению в сети Onion.
    • Использование BTC для расчётов. Оплата Биткойнами обеспечивает высокий уровень конфиденциальности.
    • Доступ к покупке сразу после оплаты. Закладки уже доставлены – зная адрес, можно забрать.
    • Минимальный риск стать жертвой мошенников. Конфликтные ситуации можно решить обращением в техподдержку, которая работает круглосуточно.
    • Рейтинговая система, которая позволяет быстро найти лучшие магазины.
    • Обслуживание России и СНГ. Список доступных мест включает сотни наименований.

    Клиентам сервиса можно бесплатно использовать дополнительные услуги. В любое время можно проконсультироваться с врачом-наркологом или юристом. А если появились проблемы – связаться с поддержкой, которая тоже отвечает в любое время.
    Дополнительный плюс сервиса – собственный форум. Перейти к нему можно из расположенной вверху панели сайта. На страницах форума находятся правила поведения, объявления и новости. И даже исследования администрации проекта и школа кладменов для общения доставщиков товара.

    Способы зайти на Кракен

    Площадка, продающий запрещённые препараты и фальшивки всех видов, запрещён государственными службами. И зайти на него, просто перейдя по ссылке не выйдет. Для доступа нужно применять зеркальные версии, браузер Тор или VPN.
    Сервисы VPN – способ, вариант, позволяющий обходить блокировки сайтов. В том числе – на площадки Даркнета. Преимущество метода – защищённое соединение, изменение IP для браузера или всего компьютера. Минусы – замедление скорости и небольшой размер бесплатного трафика.
    Второй способ – веб-обозреватель Тор. Для входа нужно пользоваться ссылкой, заканчивающейся на .ONOION. Достоинства программы – отсутствие оплаты и луковичная маршрутизация, скрытый IP и стирание истории. Минус – замедление скорости.
    Зеркальные версии – тот же сайт, который расположен по другому адресу. Отсутствуют отличия от настоящей Кракена. Можно пользоваться в обычном браузере. Зеркала будут работать, даже если прекратил работу официальный сайт. Недостаток зеркал – доступный посторонним трафик, а пользователь в поисках зеркала может перейти на фальшивую страницу. Поэтому зеркальные версии следует брать в проверенных местах. Есть такой перечень на сайте Кракен и посвященных ей форумах.

    Регистрация

    Чтобы пользоваться сайтом придётся зарегистрироваться. Это позволит совершать покупки, пользоваться форумом, общаться с техподдержкой, наркологом или юристом. Для регистрации от пользователя требуются несколько несложных действий:
    1. Перейти по правильной ссылке на площадку и указать проверочный код.
    2. В регистрационной форме указать все идентификаторы для входа. Логин – английскими литерами. Имя вводится и кириллицей.
    3. Закончить процедуру регистрации и подтвердить согласие с требованиями сервиса.
    Зарегистрированному пользователю можно использовать пароль и логин для доступа к профилю. В нём находится информация о заявках и оплате, скидках, можно настроить двухфакторную аутентификацию.

    Как совершить покупку на сайте

    Купить товар на Кракене получится за несколько простых шагов:
    1. Выбрать город в выпадающем списке. По умолчанию там стоит место, указанное при регистрации. Можно указать метро и район города.
    2. Найти нужную категорию в меню слева. Выбрать желаемый способ доставки – клад, магнит, прикоп.
    3. Посмотреть на перечень доступных магазинов. Найти нужный товар и зайти на его карточку.
    4. Познакомиться с отзывами. Если покупателя всё устраивает – нажать на кнопку «Купить».
    5. Перейдя к форме заказа указать способ оплаты. Это может быть Биткоин, банковскую картуы, пополнение счёта и даже игру в рулетку.
    6. Узнать расположение закладки и взять товар в нужном месте.
    7. Написать отзыв, чтобы другие посетители знали, что магазин надёжный – или были проблемы.
    8. Запомнить магазин в «Избранное» для быстрого доступа из профиля.
    Делая покупки, стоит познакомиться с особенностями сделок. При появлении проблем покупатели могут открывать с продавцами споры где будут участвовать админы. Первая покупка совершается только за Bitcoin. При выборе рулетки, открывается доступ к игре. Это позволяет сэкономить на покупке, делая ставки на квадратном поле 10х10. Ещё один вид экономии – промокод. Он подходит чтобы оплатить только половины цены товара.

    Гарантия отсутствия обмана

    Kraken гарантирует высокое качество продукта. Доказать, что препараты качественные, магазины могут, заказав сертификацию. При прохождении проверки данные об этом показываются в карточке.
    Гарантия отсутствия обмана – возможность подтвердить заказ в течение 24 часов. Если клад на месте, он закрывает сделку. При появлении проблем – открывается спор с участием админов. Если доказана вина магазина, деньги возвращаются покупателю. У владельца товара снижается рейтинг, а частый обман приводит к бану. Из-за этого некачественного товара на торговой площадке практически нет

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *