Зачем использовать предложение "else" Python в try/except block?

Возможный дубликат:
Python try-else

Я не вижу в этом преимущества, по крайней мере, на примере, который я только что прочитал в Dive Into Python:

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    getpass = AskPassword

(http://www.diveintopython.net/file_handling/index.html)

Почему бы вам не добиться того же эффекта с более коротким/простым:

try:
    from EasyDialogs import AskPassword
    getpass = AskPassword
except ImportError:
    getpass = default_getpass

Что мне не хватает?

Ответ 1

В примере нет преимущества, кроме, возможно, стиля. Как правило, хорошая идея сохранить код, который может вызвать исключения рядом с кодом, который с ними связан. Например, сравните их:

try:
    from EasyDialogs import AskPassword
    # 20 other lines
    getpass = AskPassword
except ImportError:
    getpass = default_getpass

и

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    # 20 other lines
    getpass = AskPassword

Вторая хорошая, когда except не может вернуться раньше или повторно выбросить исключение. Если возможно, я бы написал:

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
    return False // or throw Exception('something more descriptive')

# 20 other lines
getpass = AskPassword

Ответ 2

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

try:
    this_very_dangerous_call()
except ValueError:
    # if it breaks
    handle_value_error()
else:
    continue_with_my_code()
    # more code

Таким образом, вы визуально отделяете код обработки исключений от остальной части кода. Это как сказать: "Попробуйте это, если он сломается, что-то предпримет, если он не [вставляет длинное объяснение здесь]"