使用else子句处理异常

q09*_*987 1 python

Python教程指出:

try ... except语句有一个可选的else子句,当存在时,必须遵循所有except子句.如果try子句不引发异常,则必须执行的代码很有用.例如:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()
Run Code Online (Sandbox Code Playgroud)

使用else子句比向try子句添加其他代码要好,因为它可以避免意外捕获由try ... except语句保护的代码未引发的异常.

问题1 >在阅读上述文档后,我仍然不明白为什么我们不能简单地将代码从else子句移动到try子句中.

问题2 > try子句如何意外捕获异常,因为所有捕获都是在except子句中完成的,对吧?

kin*_*all 6

您可以将else代码放在try套件中,但是您可以捕获可能在那里引发的任何异常.如果您不打算这样做,那将是"偶然的",因此您链接到的文档的措辞.

最佳做法是在try块中放置尽可能少的代码,以便在发生错误时,您知道导致它的操作并且可以适当地处理它.如果一个try块中有五行代码,并且只期望其中一行代码引发异常,那么当您不希望它出现异常时,异常处理代码就会准备不足.在这种情况下更好的是提出异常而不是以错误的方式处理它.