Цикл функции в Python - PullRequest
       28

Цикл функции в Python

0 голосов
/ 17 октября 2018

У меня есть функция, используемая для нескольких устройств, перечисленных в списке.Выдает ошибку, если она не работает с определенными устройствами, и сценарий прерывается.

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 голосов
/ 17 октября 2018

Вам необходимо вызвать 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!
0 голосов
/ 17 октября 2018

Для первого вопроса, да, вы можете повторить несколько раз.Держите счетчик ошибок, оберните весь цикл 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 в обработку исключений.Но вам также необходимо настроить вызывающий код для правильной обработки результата None.

...