@zlodiak

Обязательно ли использовать try/else?

Скажите пожалуйста какая из двух следующих записей более корректна?

1:
try:
    html = requests.get(url, headers=self.headers)
    return html.text
except Exception as e:
    print('Root page parse is failed', e)


2:
try:
    html = requests.get(url, headers=self.headers)
except Exception as e:
    print('Root page parse is failed', e)
else:
    return html.text


PEP8 по этому поводу ничего не говорит. В нём есть похожий пример, но он раскрывает другую идею:
Yes:

try:
    value = collection[key]
except KeyError:
    return key_not_found(key)
else:
    return handle_value(value)
No:

try:
    # Too broad!
    return handle_value(collection[key])
except KeyError:
    # Will also catch KeyError raised by handle_value()
    return key_not_found(key)
  • Вопрос задан
  • 507 просмотров
Решения вопроса 1
Ваши варианты не ошибочны, но есть несколько моментов для осмысления.
Судя по наличию return, у Вас функция возвращает текст. Какое поведение Вы предусмотрели
в случае неудачного завершения операции requests.get? И на каком уровне Вы намерены
обрабатывать ошибки. Никто не может сказать Вам, как правильно, пока не узнает контекст
Вашей задачи. Может Вы выберите стратегию: "падать как можно раньше" и вызвав панику
завершите приложение, запишите в лог и перейдете к следующему url или что то еще.

Предложу Вам третьи вариант:
try:
    html = requests.get(url, headers=self.headers)
except Exception as e:
    print('Root page parse is failed', e)
    # Ваши инструкции для ошибочной ситуации
return html.text

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

P.S. Если будет время, то виды исключении лучше обрабатывать явно, а не
ловить их все в один блок. Так можно прописать несколько стратегии для
разных случаев сбоя.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Andy_U
Оба вариант некорректны. Протестируйте и увидите.
Ответ написан
h0w4rd
@h0w4rd
Python dev.
Первый вариант конечно. Второй не будет работать даже.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы