Попробуйте / остальное с возвратом в блок попробовать

Я наткнулся на странное поведение в 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 , если значение возвращается В попробуй . Однако он всегда будет идти в , наконец, в блоке . Я действительно не понимаю, почему. Может кто-нибудь помочь мне с этой логикой?

Спасибо

44
задан Simon Bergot 16 September 2011 в 08:40
поделиться

2 ответа

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

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

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

56
ответ дан 26 November 2019 в 22:05
поделиться

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

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

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

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

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

>>> whoops()
False

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

9
ответ дан 26 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: