Python 如果函数抛出异常而不返回,这是一种不好的做法吗?

Python 如果函数抛出异常而不返回,这是一种不好的做法吗?,python,python-3.x,Python,Python 3.x,我有一些软件配置的计算功能,可以驱动硬件设置。在某些情况下,用户可能输入无效的配置值。如果使用了无效值,我会抛出一个异常,如果配置正常,我会简单地返回我的计算值: def calc_exhale_dur(breath_rate, inh_dur, breath_hold_dur): """Calculate exhalation duration. Args: breath_rate (float): animal breath rate (br/min)

我有一些软件配置的计算功能,可以驱动硬件设置。在某些情况下,用户可能输入无效的配置值。如果使用了无效值,我会抛出一个异常,如果配置正常,我会简单地返回我的计算值:

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代码,同时仍然满足我的计算方法的需要。

引发异常的目的是在无法找到有效返回值的情况下提供另一个退出点。您使用的异常完全符合预期

但是,我可能会先检查呼气_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

引发异常的目的是在找不到有效返回值的事件中提供备用退出点。您使用的异常完全符合预期

但是,我可能会先检查呼气_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

不会。异常要么在一段代码中处理,要么抛出,并由调用方决定如何处理它们。如果您返回某些内容,则必须选择第一个选项。你选择了第二个。这很有道理。这就是抛出异常的全部想法。异常要么在一段代码中处理,要么抛出,并由调用方决定如何处理它们。如果您返回某些内容,则必须选择第一个选项。你选择了第二个。这很有道理。这就是抛出异常的全部想法

如果它抛出异常,返回一些东西有什么意义?如果某个东西抛出异常,返回它有什么意义?谢谢你的洞察力。这比贴出的重复答案更完整地回答了我的具体问题。谢谢你的洞察力。这比贴出的重复答案更完整地回答了我的具体问题。