Это плохая практика иметь функцию, которая не возвращает, если она выдает исключение? [Дубликат]

1

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

def calc_exhale_dur(breath_rate, inh_dur, breath_hold_dur):
    """Calculate exhalation duration.

    Args:
        breath_rate (float): animal breath rate (br/min)
        inh_dur (float): animal inhalation duration (ms)
        breath_hold_duration (float): animal breath hold duration (ms)
    """

    single_breath_dur = calc_breath_dur(breath_rate)
    exhale_dur = single_breath_dur - (inh_dur + breath_hold_dur)

    if (inh_dur + breath_hold_dur + exhale_dur) > single_breath_dur:
        raise error.ConfigurationError
    elif exhale_dur <= 0:
        raise error.ConfigurationError
    else:
        return exhale_dur

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

  • 2
    Какой смысл возвращать что-то, если это вызывает исключение. ?
Теги:
python-3.x

2 ответа

8
Лучший ответ

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

Тем не менее, я бы, вероятно, проверял, не является ли exhale_dir неположительным первым, что избавит вас от выполнения вычисления с недопустимым значением.

if exhale_dur <= 0:
    raise error.ConfigurationError
elif (inh_dur + breath_hold_dur + exhale_dur) > single_breath_dur):
    raise error.ConfigurationError

# You can also omit the else, since the only way to reach this point
# is to *not* have raised an exception. This is a matter of style, though.
return exhale_dur
  • 0
    Спасибо за ваше понимание. Это отвечает на мой конкретный вопрос более полно, чем опубликованный дубликат.
2

Нет. Исключения либо обрабатываются в куске кода, либо бросаются, и оставляют его вызывающему, чтобы решить, что с ними делать. Если вы что-то вернете, вам нужно выбрать первый вариант. Вы выбрали второе. Делает совершенный смысл. Что вся идея выбросить исключение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню