我有以下代码。
MAXIMUM_DAYS = 7
def foo(start_date = None, end_date = None):
if abs((parse(start_date) - parse(end_date)).days) > MAXIMUM_DAYS:
return ?
如何编写函数以使其退出/错误并且我可以测试该行为?
我在单元测试中看到了 AssertRaises 方法。是否像创建自定义异常并在函数中引发它,然后在单元测试中对其进行测试一样简单?
如果是,是否有关于如何以及在何处编写异常的标准?
在文档或在线的某处是否有一个很好的例子?
谢谢,
肖恩
答案 0 :(得分:1)
您走在正确的轨道上 - 使用异常是实现您的想法的常用技术。 assert
抛出异常,但它通常不用于生产代码,因为 assert
语句可以在命令行中禁用。相反,对于您的情况,提出 ValueError
断言将是一个不错的选择:
MAXIMUM_DAYS = 7
def foo(start_date = None, end_date = None):
if abs((parse(start_date) - parse(end_date)).days) > MAXIMUM_DAYS:
raise ValueError(f'Date range exceeds max: {MAXIMUM_DAYS}')
答案 1 :(得分:1)
警告...我的假设是,如果您的计算值大于 MAXIMUM_DAYS,您会问如何引发异常。基于这个假设,这是我的答案。
首先定义您的异常:
class GreaterThanMaximumDays(Exception):
pass
然后只需在您的代码中
MAXIMUM_DAYS = 7
def foo(start_date = None, end_date = None):
start_date_value = parse(start_date)
end_date_value = parse(end_date)
date_difference = abs(start_date_value - end_date_value)
if date_difference > MAXIMUM_DAYS:
raise GreaterThanMaximumDays()
return date_difference
您关于它是否像使用 AssertRaises 一样简单和容易的猜测是正确的。
就我个人而言,我喜欢定义自己的异常,这样我就可以轻松地在异常处理中测试它的存在。我发现它使我的代码更易于阅读和理解我期望的有效内容。
<块引用>我将解析后的值提取到它们自己的变量中。如果您出于任何原因需要检查返回值,这只会使调试更容易。