在Python中循环执行功能

时间:2018-10-17 15:06:02

标签: python function python-2.6

我有一个用于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
  1. 我们可以在它转到“除外”之前循环(重试多次)吗?还是
  2. 如果设备出现故障,我们可以跳过它并尝试下一个设备吗?

2 个答案:

答案 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!