Приведет ли необработанное исключение Python к памяти или другим проблемам? - PullRequest
0 голосов
/ 19 февраля 2019

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

Следующая функция выполняет сетевой запрос и возвращает полученный результат.

Сетьзапрос может иногда завершаться ошибкой из-за IOError, но если код повторяется, он сможет подключиться и получить результат снова.Таким образом, в коде есть механизм повтора для устранения такой ошибки.

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

Вот код:

def my_func():
    retry_times = 5
    sleep_time = 5
    for i in range(0, 6)
        try:
            result = network_request()
            break
        except IOError as err:
            if i == retry_times:
                log.error
                raise
            else:
                log.warning("Request failed, sleep %s seconds and retry <%s/%s>"
                            % (sleep_time, i, retry_times))
    return result

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

Он называет это «утечкой исключения», которая нарушает общее правило кодирования.Вот его код (строки с # добавленной строкой кода - это измененные строки):

def my_func():
    retry_times = 5
    sleep_time = 5
    for i in range(0, 6)
        try:
            result = network_request()
            break
        except IOError as err:
            if i == retry_times:
                log.error
                raise
            else:
                log.warning("Request failed, sleep %s seconds and retry <%s/%s>"
                            % (sleep_time, i, retry_times))
        except Exception:  # Added code line
            log.error("Error happened: %s" % err)  # Added code line
            exit(1)
    return result

Я сказал, что он делает то, что только что сделал Python:

  1. Распечатайте журнал ошибок.
  2. Существуют сценарии с ненулевым кодом выхода

Но он утверждает, что «как вы узнаете, что Python ничего не сделал, когда вы перехватываете исключение?», «Оставляя необработанное исключениевызовет утечку памяти "," любая хорошо спроектированная программа никогда не оставит непонятное исключение до конца, это здравый смысл ".

Это смутило меня, потому что я никогда не слышал о таком" здравом смысле ",особенно для Python (нет уверенности, что в C ++ есть этот «здравый смысл»).Я погуглил тему и обнаружил, что там даже никто не задавал такой вопрос.С самого начала я узнал, что принцип обработки исключений таков:

  1. Обрабатывать те исключения, которые может обрабатывать ваш код.
  2. Поднять эти исключения во внешнюю область, есливы не можете с этим справиться.

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

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

Итак, здесь я спрашиваю: 1. «Оставит ли необработанное исключение до конца и, в конце концов, приведет к завершению работы скрипта», что вызовет любую проблему, как »утечка памяти "или что?2. Есть ли такой «здравый смысл» в правиле кодирования Python, чтобы не оставлять до конца необработанное исключение, если «сценарий печати ошибок» и «выход с ненулевым кодом» - это именно то, что скрипт хочет сделать.

1 Ответ

0 голосов
/ 19 февраля 2019

Это зависит от вашего другого кода.Многие фреймворки (например, Django) имеют переменную настроек DEBUG.Если установлено истинное значение, соответствующие данные будут раскрыты.Если пользователи не отображаются, появляется ошибка 404.

Если вы используете линтер, он говорит вам, что перехват неуказанных исключений является плохой практикой

...