正如我在评论中所说的,您需要重新定义异常,以便原始函数能够实际捕获并继续。您希望在except处理程序中只将缩进减少一个,这样就不会在左侧结束得太远:class traced(object):
indent =0
def __init__(self,f):
self.__name__=f.__name__
self.indent=0
self.f=f
def __call__(self,*args,**kwargs):
string=""
if kwargs:
l=[]
for (key, value) in kwargs.items():
l.append(str(key) + "=" + str(value))
a=', '.join(l)
string = '('+a+')'
else:
l=[]
for value in args:
l.append(str(value))
a=', '.join(l)
string = '('+a+')'
print('| ' * traced.indent + ',- '+ self.__name__+' '+string)
try:
traced.indent+=1
value = self.f(*args,**kwargs)
except Exception:
traced.indent-=1 # < only decrement by one
raise # < reraise the exception so the original function can catch it
traced.indent-=1
print('| '* traced.indent + "`- "+ repr(value))
return value
然后它就起作用了:
^{pr2}$
最后,我会清理一下装修工,让它更简洁明了,你在做什么:class traced(object):
indent = 0
def __init__(self, f):
self.__name__ = f.__name__
self.f = f
def __call__(self, *args, **kwargs):
if kwargs:
l = [str(key) + '=' + str(value) for key, value in kwargs.items()]
else:
l = list(map(str, args))
print('| ' * traced.indent + ',- {0} ({1})'.format(self.__name__, ', '.join(l)))
try:
traced.indent += 1
value = self.f(*args,**kwargs)
finally:
traced.indent -= 1
print('| ' * traced.indent + '`- ' + repr(value))
return value
在这里,我简化了整个参数聚合以使用列表理解。我还使用了字符串格式,使格式更加清晰。这样,您还可以组合必须放在列表内容周围的括号(在这两种情况下都是这样做的)。当你在没有真正查看异常的情况下重读异常时,我们不需要从一开始就捕捉它,只需确保我们调整了finally块中的缩进。在
实际上,为什么要检查变量参数或关键字参数?接受这两者:l = list(map(str, args))
l.extend([str(key) + '=' + str(value) for key, value in kwargs.items()])