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