2012-01-11 38 views
1

Python的教程states:处理异常与else子句

的尝试... except语句有一个可选的else子句,其中, 存在时,必须遵循所有的除外条款。这对代码 非常有用,如果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() 

使用该else子句是不是增加额外的代码 到try子句,因为它避免了意外捕获异常 不是由代码募集的被保护更好尝试...除了 声明。

问题1>阅读上述文件后,我仍然没有得到想法,为什么我们不能简单地将代码从else子句进入try子句

问题2>如何try子句可能会意外地捕捉异常,因为所有的捕捞量在做except子句,对不对?

回答

2

回答这两个问题是相似的,

如果移动代码在try子句,那么你就无法从其中异常从哪里来肯定。因此,如果你有另外一行代码产生一个意外的IOError,你可以结束搜索一个没有的问题。

所以为了更好地检测你的代码,你希望尽可能简化尝试中尽可能使catch的特性。

6

您可以将else代码放在try套件中,但是您会发现可能在此处引发的任何异常。如果你不打算这样做,那将是“偶然的”,因此你链接到的文件的措词。

最佳做法是在try块中尽可能少地添加代码,以便发生错误时知道哪些操作导致了该错误,并且可以正确处理它。如果在try块中有五行代码,并且只希望其中一个产生异常,那么当您预期不会发生异常时,您的异常处理代码将会准备不足。在这种情况下更好地让异常被提出,而不是以错误的方式处理。

3

如果从其他移动代码到尝试那么它将成为可引发异常“关键路径”的一部分。如果f.readlines()引发某种异常(由于磁盘上的坏扇区而在读取文件时可能出现I/O错误),那么该错误将与您当前捕获的一个错误混淆。 (从技术上讲,“无法打开”的错误信息在这一点上是错误的......因为打开一个文件可能会在以后读取失败时成功;事实上,在处理它之前,甚至在发生I/O错误之前打开它一定会成功) 。

通常你会使用一个模式更像是:

foo = None 
try: 
    # some code to access/load/initialize foo from an external source 
except ...: 
    # handle various types of file open/read, database access, etc errors 
else: 
    foo = something 

...所以你随后运行的代码,只需检查foo是无并使用它或 解决它是不可用的什么你认为合适的方式。

1

1)当然,您可以将else子句中的代码移动到try子句中。您可以将它完全移出try块,但这样可以提供额外的灵活性,并进一步调整代码。另外,也许错误被捕获的特异性。您可以列出可能会发生的不同异常的全部负载,每个异常都有不同的语句。 else子句中的内容仍然只会在try块中最后一行执行后没有引发异常时才会发生。例如打印成功的返回消息。 此外,try子句在垃圾回收管理和错误跟踪方面增加了一些额外的CPU开销,因此try子句之外的任何内容都没有以相同方式保护,并且可能运行得更有效。

2)错误捕捉是非常具体的。例如以上示例中的except子句只在运行f = open(arg,'r')行时引发IOError时才会运行。如果您想捕捉任何形式的例外情况,请使用except Exception: