关闭。这个问题是 opinion-based 。它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。
2年前关闭。
Improve this question
许多 try/except/finally 子句不仅“丑化”了我的代码,而且我发现自己经常对类似的任务使用相同的异常处理。所以我正在考虑通过将它们“外包”给......装饰器来减少冗余。
因为我确定不是第一个得出这个结论的人,所以我用谷歌搜索并发现了这个 - 恕我直言 - 巧妙的 recipe 增加了处理多个异常的可能性。
但是我很惊讶为什么这本身似乎并不是一个广为人知和使用的实践,所以我想知道是否有我没有考虑的方面?
最佳答案
在代码本身中保留 try/except/finally 块的最大原因是错误恢复通常是函数的一个组成部分。
例如,如果我们有自己的 int()
函数:
def MyInt(text):
return int(text)
text
无法转换怎么办?返回 0
?返回 None
?如果您有许多简单的情况,那么我可以看到一个简单的装饰器很有用,但我认为您链接到的配方尝试做的太多:它允许为每个可能的异常激活不同的功能 - 在这种情况下(几个不同的异常(exception),几个不同的代码路径)我会推荐一个专用的包装函数。
这是我对简单装饰器方法的看法:
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
关于python - "outsourcing"装饰器的异常处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9647021/