【发布时间】:2012-07-10 08:26:14
【问题描述】:
是否可以编写一个异常处理程序来捕获类中所有方法产生的运行时错误?我可以通过用 try/except 包围每一个来做到这一点:
class MyError(Exception):
def __init__(self, obj, method):
print 'Debug info:', repr(obj.data), method.__name__
raise
class MyClass:
def __init__(self, data):
self.data = data
def f1(self):
try:
all method code here, maybe failing at run time
except:
raise MyError(self, self.f1)
我想知道是否有更通用的方法来实现相同的效果 - 对于课堂上任何地方引发的任何错误。我希望能够访问类数据以打印一些调试信息。 另外,如何获取失败的方法名称(示例中为 f1)?
更新:感谢所有有见地的答案,装饰器的想法看起来是要走的路。
关于捕获所有异常的风险:except 分支中的 raise 语句应该重新引发异常而不会丢失任何信息,不是吗?这就是为什么我也把它放在 MyError 中......
【问题讨论】:
-
你可以为此写一个装饰器。
-
您还可以编写一个元类,在定义时将@phg 的装饰器应用于每个方法。
-
@chepner 作为答案提交。
-
类中all 方法的all 异常的每类异常似乎是一个设计错误。所以如果
f1()得到一个 IOError,它应该报告为一个 MyError?这势必会丢失信息和混淆。详情请见blog.ianbicking.org/2007/09/12/re-raising-exceptions。