我有一些测试用例。测试用例依赖于需要时间计算的数据。为了加快测试速度,我缓存了数据,这样就不必重新计算了。在
我现在有了foo()
,它查看缓存的数据。我不能提前告诉它会看到什么,因为这在很大程度上取决于测试用例。在
如果一个测试用例失败是因为它没有找到正确的缓存数据,我不希望它失败-我希望它计算数据,然后再试一次。我也不知道它会抛出什么异常导致丢失数据。在
我现在的代码如下:
if cacheExists:
loadCache()
dataComputed = False
else:
calculateData()
dataComputed = True
try:
foo()
except:
if not dataComputed:
calculateData()
dataComputed = True
try:
foo()
except:
#error handling code
else:
#the same error handling code
重新构造代码的最佳方法是什么?在
有时没有好的方式来表达一个流,它只是复杂。但是这里有一种方法,只在一个地方调用foo(),并且只在一个地方进行错误处理:
你可能不喜欢这个循环,YMMV。。。在
或者:
^{pr2}$except
几乎永远不是一个好主意(除非它所做的只是某种形式的日志记录,后面跟着一个raise
让异常传播)。因此,假设您有一个元组,其中包含您期望的所有异常类型,并希望以相同的方式进行处理,例如:并且总是使用
except expected_exceptions:
,而不是裸的except:
。在因此,如果不考虑这一点,一个稍微不那么重复的方法是:
^{pr2}$另一种方法是使用辅助函数包装try/except逻辑:
这样的助手通常在几种不同的情况下有用,所以在项目的“实用程序”模块中有这样的东西是很常见的。现在,对于您的案例(没有参数,没有结果),您可以使用:
我认为它更线性化,因此更简单。这种通用方法的唯一问题是,
may_raise
这样的辅助函数不会强迫您以某种方式处理异常,因此您可能会忘记这样做(就像使用返回码而不是异常来指示错误一样,很容易错误地忽略这些返回值);因此,少用它。。。!-)在使用一揽子例外通常不是一个好主意。你认为那里会有什么样的例外?是键错误,属性错误,类型错误。。。在
一旦确定了要查找的错误类型,就可以使用
hasattr()
或in
运算符之类的东西,或者在处理异常之前对您的条件进行测试。在这样你就可以清理你的逻辑流,并省去你的异常处理那些真正被破坏的东西!在
相关问题 更多 >
编程相关推荐