Перезапуск программы после исключения

у меня есть программа, которая запрашивает API каждые несколько секунд. Каждый ответ запускает несколько функций, которые сами делают некоторые звонки на веб-сайты и такие-звонки, которым я не хочу слепо доверять, чтобы добиться успеха. Если я поймаю исключение в foo(), например, или даже в функции, которая foo() звонит, можно ли полностью перезапустить программу в блоке except? По сути, я хочу позвонить queryRepeatedly() при исключении в одной из его подфункций, без сохранения предыдущего вызова стек.

конечно, я мог бы вернуть значения маркеров и решить это по-другому, но программа структурирована таким образом, что приведенный выше подход кажется намного проще и чище.

# Sample "main" function that I want to call
def queryRepeatedly():
    while True:
        foo()
        bar()
        baz()
        time.sleep(15)

def foo():
    # do something
    try:
        foo2() # makes a urllib2 call that I don't trust
    except:
        #restart queryRepeatedly

queryRepeatedly()

любые предложения приветствуются! Спасибо.

3 ответов


чтобы перезапустить что-либо, просто используйте while цикл за пределами на try. Например:

def foo():
    while True:
        try:
            foo2()
        except:
            pass
        else:
            break

и если вы хотите передать исключение вверх по цепочке, просто сделайте это во внешней функции вместо внутренней функции:

def queryRepeatedly():
    while True:
        while True:
            try:
                foo()
                bar()
                baz()
            except:
                pass
            else:
                break
        time.sleep(15)

def foo():
    foo2()

все, что отступ-это немного трудно читать, но легко отрефакторить этот:

def queryAttempt()
    foo()
    bar()
    baz()

def queryOnce():
    while True:
        try:
            queryAttempt()
        except:
            pass
        else:
            break

def queryRepeatedly():
    while True:
        queryOnce()
        time.sleep(15)

но если вы думаете об этом, вы также можете объединить два while петли в одну. Использование continue может быть немного запутанным, но вижу, что вам нравится больше:

def queryRepeatedly():
    while True:
        try:
            foo()
            bar()
            baz()
        except:
            continue()
        time.sleep(15)

рефакторинг это-вы получите ошибку stackoverflow рано или поздно, если у вас достаточно сбоев.

queryRepeatedly должна быть query. Он должен вернуться void и выбрасывать исключения при сбоях.

оберните во что-то, что выглядит так, ваш истинный


в вашем исключении сделайте рекурсивный вызов

except:
      queryRepeatedly()