关于异常处理:为什么在try / except块中使用Python的“else”子句?

Why use Python's “else” clause in try/except block?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Python try-else

我没有看到它的好处,至少根据我刚刚在Dive into python中读到的示例:

1
2
3
4
5
6
try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    getpass = AskPassword

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

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

1
2
3
4
5
try:
    from EasyDialogs import AskPassword
    getpass = AskPassword
except ImportError:
    getpass = default_getpass

我错过了什么?


在这个例子中没有优势,除了样式。通常,最好保留代码,这样可以在处理它们的代码附近引起异常。例如,比较以下内容:

1
2
3
4
5
6
try:
    from EasyDialogs import AskPassword
    # 20 other lines
    getpass = AskPassword
except ImportError:
    getpass = default_getpass

1
2
3
4
5
6
7
try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
else:
    # 20 other lines
    getpass = AskPassword

except不能提前返回或重新抛出异常时,第二种方法是好的。如果可能的话,我会写:

1
2
3
4
5
6
7
8
try:
    from EasyDialogs import AskPassword
except ImportError:
    getpass = default_getpass
    return False // or throw Exception('something more descriptive')

# 20 other lines
getpass = AskPassword


我个人觉得在某些情况下更清楚。当然,当没有发生异常时,应该运行更多的代码。从某种意义上说:

1
2
3
4
5
6
7
8
try:
    this_very_dangerous_call()
except ValueError:
    # if it breaks
    handle_value_error()
else:
    continue_with_my_code()
    # more code

因此,您可以直观地将异常处理代码与其余代码分开。就像是说:"试试这个,如果它坏了做点什么,如果它不[在这里插入长解释]"