我有一个用于LIST中列出的多个设备的功能。如果不适用于特定设备并且脚本中断,则会引发错误。
def macGrabber(child,switch,cat = False):
try:
if cat is False:
child.expect('.#')
child.sendline('sh mac address-table | no-more')
else:
child.sendline('sh mac address-table dynamic | i Gi')
child.expect('.#', timeout=3000)
except pexpect.TIMEOUT:
print child.before,child.after
child.close()
raise
macs = child.before
child.close()
macs = macs.splitlines()
print('Connection to %s CLOSED' % switch)
return macs
答案 0 :(得分:1)
对于第一个问题,是的,您可以重试多次。保留一个错误计数器,将整个try/except
包裹起来,然后在遇到异常时检查错误计数器,如果小于(比如说5),则继续循环,否则就增加错误。
error_count = 0
while True:
try:
if cat is False:
child.expect('.#')
child.sendline('sh mac address-table | no-more')
else:
child.sendline('sh mac address-table dynamic | i Gi')
child.expect('.#', timeout=3000)
break
except pexpect.TIMEOUT:
++error_count
if error_count < 5:
continue
print child.before,child.after
child.close()
raise
对于第二个问题,是的,您可以通过仅将return None
放在except处理中来跳过设备出现故障的情况。但是您还需要调整调用代码以正确处理None
结果。
答案 1 :(得分:1)
如果您想继续循环而不会导致程序崩溃,则需要在macGrabber
块内调用try...except
,然后调用continue
。
multiple_devices = [
(child1, switch1, cat1),
(child2, switch2, cat2),
...,
]
for device in multiple_devices:
try:
macGrabber(*device)
except pexpect.TIMEOUT as e:
print(f'{device} timed out')
print(e)
continue # <--- Keep going!