python try expect raise_python在expect异常之后返回try块

本文讲解如何重构Python代码,以正确处理异常并保持代码清晰。通过修改`traced`类,作者演示了如何在调用函数时跟踪缩进和参数,同时确保原始函数能捕获异常。最终版本使用列表推导和字符串格式化简化了参数处理。
摘要由CSDN通过智能技术生成

正如我在评论中所说的,您需要重新定义异常,以便原始函数能够实际捕获并继续。您希望在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()])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值