try / else с возвратом в блок try - PullRequest
41 голосов
/ 16 сентября 2011

Я столкнулся со странным поведением в python. Я не смог найти информацию об этом в справке по Python или о SE, поэтому вот оно:

def divide(x, y):
    print 'entering divide'
    try:
        return x/y
    except:
        print 'error'
    else:
        print 'no error'
    finally:
        print 'exit'

print divide(1, 1)
print divide(1, 0)

вывод:

entering divide
exit
1
entering divide
error
exit
None

Похоже, что python не попадет внутрь блока else, если значение возвращается в try. Тем не менее, он всегда будет идти в блоке finally. Я не очень понимаю, почему. Может ли кто-нибудь помочь мне с этой логикой?

спасибо

Ответы [ 5 ]

55 голосов
/ 16 сентября 2011

http://docs.python.org/reference/compound_stmts.html#the-try-statement

Необязательное условие else выполняется, если и когда управление выходит за пределы конца предложения try.

В настоящее время управление «вытекает из конца», за исключениемв случае исключения или выполнения оператора return, continue или break.

12 голосов
/ 16 сентября 2011

Причиной такого поведения является return внутри try.

При возникновении исключения блоки finally и except выполняются до return.В противоположном случае, когда исключение не происходит, else выполняется, а except - нет.

Это работает, как и ожидалось:

def divide(x, y):
    print 'entering divide'
    result = 0
    try:
        result = x/y
    except:
        print 'error'
    else:
        print 'no error'
    finally:
        print 'exit'

    return result

print divide(1, 1)
print divide(1, 0)
8 голосов
/ 16 сентября 2011

Блок else не выполнен, поскольку вы покинули функцию до того, как у нее появилась возможность сделать это.

Однако блок finally выполняется всегда (если вы не дернули шнур питания).или что-то в этом роде.

Рассмотрим это (как мысленный эксперимент; пожалуйста, не делайте этого в реальном коде):

def whoops():
    try:
        return True
    finally:
        return False

Посмотрите, что он возвращает:

>>> whoops()
False

Если вас это смущает, вы не одиноки.Некоторые языки, такие как C #, активно запрещают вам помещать оператор return в предложение finally.

2 голосов
/ 13 марта 2017

Почему не выполняется предложение else?

Предложение else полезно для кода, который должен быть выполнен , если предложение try выполненоне вызывать исключение .

  • Когда вы звоните divide(1, 0), ваше try предложение вызывает исключение ZeroDivisionError, поэтомупредложение else не выполняется.

  • При вызове divide(1, 1) предложение try успешно выполняется, и возвращает .Таким образом, предложение else никогда не достигается.


Почему предложение finally всегда выполняется?

finally предложение всегда выполняется перед выходом из оператора try , независимо от того, произошло исключение или нет.

См. Выше.


https://docs.python.org/3.5/tutorial/errors.html

1 голос
/ 16 сентября 2011

«return» завершает функцию и возвращает все, что вы хотите, чтобы она вернула.Так что, конечно, так не будет.«наконец» всегда выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...