为什么在try/except块中使用Python的"else"子句?

odi*_*ity 5 python coding-style idioms exception-handling

可能重复:
Python try-else

我没有看到它的好处,至少基于我刚刚在Dive Into Python中阅读的示例:

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    getpass = AskPassword
Run Code Online (Sandbox Code Playgroud)

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

你为什么不能用更短/更简单的方法达到同样的效果:

try:
    from EasyDialogs import AskPassword
    getpass = AskPassword
except ImportError:
    getpass = default_getpass
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Izk*_*ata 5

除了样式之外,示例中没有优势.保留代码可能会导致代码处理异常,这通常是一个好主意.例如,比较这些:

try:
    from EasyDialogs import AskPassword
    # 20 other lines
    getpass = AskPassword
except ImportError:
    getpass = default_getpass
Run Code Online (Sandbox Code Playgroud)

try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    # 20 other lines
    getpass = AskPassword
Run Code Online (Sandbox Code Playgroud)

第二个是好的,当except不能提前返回,或重新抛出异常.如果可能的话,我会写:

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

# 20 other lines
getpass = AskPassword
Run Code Online (Sandbox Code Playgroud)