2014-12-18 2 views
-1

У меня будет следующая структура кода в моем скрипте Python. Но goto является уродливым и не разрешено использовать в Python.Эквивалент GOTO в обработке исключений Python

Может ли кто-нибудь предложить более красивый и более питонический дизайн потока для этого?

PS: Я попытался использовать рекурсивный вызов функции в обработчике исключений, но через некоторое время программа съела много памяти.

try: 
    # label: log_in 
    login_to_system() 
    # label: run 
    while True: 
     query() 
     calculate() 
     update() 
    # Network exceptions might occur during login and query/update 
    # Other exceptions might occur during query/calculate/update but do not need to login again. 

except SomeNetworkException: 
    # Need to log in to system again 
    go to: label log_in 
except OtherExceptions: 
    go to: label run 

Обновлен:

В этом случае обработчик исключений Network является «общим» оба логином и другими функциями.

Ранее я завернул функцию login_to_system() с помощью блока try/except и написал тот же код в обработчике исключений для входа в систему, но я чувствовал себя уродливо иметь тот же код обработчика исключений дважды в этом блоке.

+3

Почему бы не просто поставить код обработки исключений под 'исключением ', вместо того, чтобы прыгать в другое место? –

+1

Перестройте свой код, чтобы он не нуждался в goto; вместо этого используйте правильную петлю и выйдите из цикла, когда это больше не нужно. Переместите обработку исключений ближе к тому, где фактически нужно обработать исключение. –

+0

Я не могу сказать больше, поскольку ваш образец кода является слишком общим для нас, чтобы быть более конкретным здесь. –

ответ

1

Я бы переписать эту логику следующим образом: Обработка движение исключение в петлю и на каждой итерации проверки, если вам необходимо авторизоваться на сайте:

needs_login = True 

while True: 

    try: 

     if needs_login: 
      login_to_system() 
      needs_login = False 

     query() 
     calculate() 
     update() 

    except SomeNetworkException: 
     needs_login = True 

    except OtherExceptions: 
     pass 
Смежные вопросы