6

可能重复:
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

我错过了什么?

4

2 回答 2

5

该示例中没有任何优势,除了可能在样式方面。将可能导致异常的代码保留在处理它们的代码附近通常是一个好主意。例如,比较这些:

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
于 2013-01-29T19:01:43.433 回答
2

我个人觉得在某些情况下更清楚。当没有发生异常时,自然应该运行更多的代码。所以在某种程度上你是在说:

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

因此,您在视觉上将异常处理代码与其余代码分开。这就像说:“试试这个,如果它中断了做某事,如果它没有[在此处插入长解释]”

于 2013-01-29T19:04:35.483 回答