为啥在 try/except 块中使用 Python 的“else”子句? [复制]
Posted
技术标签:
【中文标题】为啥在 try/except 块中使用 Python 的“else”子句? [复制]【英文标题】:Why use Python's "else" clause in try/except block? [duplicate]为什么在 try/except 块中使用 Python 的“else”子句? [复制] 【发布时间】:2013-01-13 10:49:12 【问题描述】:可能重复: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
我错过了什么?
【问题讨论】:
如果getpass = AskPassword
行本身可以引发ImportError
怎么办?
复制? Python try-else
这样做的问题是您最终将异常用于控制流而不是错误处理。
@Izkata 我认为您可以在不征求第二意见的情况下点击关闭按钮:P...
在这种情况下 else 子句很冗长,因为你可以这样做 from EasyDialogs import AskPassword as 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
【讨论】:
我认为这仍然是一个骗局,但至于代码风格我会投赞成票。不过最好将其添加到重复的答案中。 @owlstead 听起来不错,我会这样做;)【参考方案2】:我个人觉得在某些情况下更清楚。当异常不发生时,自然应该运行更多的代码。所以在某种程度上你是说:
try:
this_very_dangerous_call()
except ValueError:
# if it breaks
handle_value_error()
else:
continue_with_my_code()
# more code
因此,您在视觉上将异常处理代码与其余代码分开。这就像说:“试试这个,如果它中断了做某事,如果它没有[在此处插入长解释]”
【讨论】:
问题是我不喜欢这种排序。我认为预期/乐观的代码路径应该是突出的,然后是异常处理。这种模式将它放在中间,在主要路径的两半之间。不适合我。 嗯,它可以用来区分可以和不能抛出异常的代码部分。但这也类似于你有一个类似“if a then b else c”的函数的情况,问题是“常见情况”是否(更长并且有更多逻辑) ) 应该是“then”块还是“else”块? 也看看***.com/questions/855759/python-try-else以上是关于为啥在 try/except 块中使用 Python 的“else”子句? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Python:在 try/except/else 块中引发异常,处理顺序问题
如何在 try except 块中检查某种类型的 OSError?