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

时间:2013-01-29 18:53:46

标签: python exception-handling coding-style idioms

  

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

我错过了什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

因此,您可以直观地将异常处理代码与其余代码分开。这就像是说:“尝试这个,如果它没有做某事,如果没有[在这里插入长篇解释]”