我有一些计算功能,用于配置将驱动硬件设置的软件。在某些情况下,用户可能输入无效的配置值。如果使用了无效的值,我会抛出一个异常来解决这个问题;如果配置有效,我会简单地返回我的计算值:
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代码,同时又能满足我的计算方法的需求。
答案 0 :(得分: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
答案 1 :(得分:2)
不。异常要么在一段代码中处理,要么抛出,然后由调用者决定如何处理它们。如果您退货,则必须选择第一个选项。您选择了第二个。很有道理。那就是抛出异常的整个想法