许多尝试/除/最后-子句不仅“丑化”了我的代码,而且我发现自己经常在类似的任务中使用相同的异常处理。所以我在考虑把他们“外包”到一个.装饰师。
因为我肯定不是第一个得出这个结论的人,所以我在谷歌上搜索并发现了这个- imho -巧妙的食谱,它增加了处理多个异常的可能性。
但我很惊讶,为什么这似乎不是一个广泛的已知和使用的实践本身,所以我想知道是否有一个方面,我没有考虑?
发布于 2012-03-10 15:11:57
在代码本身中保留try/ part /finally块的最大原因是错误恢复通常是函数的一个组成部分。
例如,如果我们有自己的int()函数:
def MyInt(text):
return int(text)如果text不能被转换,我们该怎么办?还0?返回None
如果您有许多简单的案例,那么我可以看到一个简单的装饰器是有用的,但是我认为您链接到的菜谱做得太多了:它允许为每个可能的异常激活不同的函数--在这些情况下(几个不同的异常,几个不同的代码路径),我会推荐一个专用的包装函数。
下面是我对一个简单的装饰方法的看法:
class ConvertExceptions(object):
func = None
def __init__(self, exceptions, replacement=None):
self.exceptions = exceptions
self.replacement = replacement
def __call__(self, *args, **kwargs):
if self.func is None:
self.func = args[0]
return self
try:
return self.func(*args, **kwargs)
except self.exceptions:
return self.replacement以及样本使用情况:
@ConvertExceptions(ValueError, 0)
def my_int(value):
return int(value)
print my_int('34') # prints 34
print my_int('one') # prints 0发布于 2012-03-10 14:50:24
基本上,缺点是您不再决定如何在调用上下文中处理异常(只允许异常传播)。在某些情况下,这可能导致责任不分开。
发布于 2012-03-10 15:00:02
https://stackoverflow.com/questions/9647021
复制相似问题