在“try”运算符中嵌套“for”循环

时间:2012-01-13 18:12:57

标签: python nested-loops

民间,

我已经辞职以解决这个问题,但我想检查一下Python是否真的按预期运行。

在示例中," sample.txt"是任何读取和解析的多行文本文件。

try:
    file=open('sample.txt','r')
    for line in file:
          (some action here)
except:
    print "Couldn't open file"
file.close()

我观察到的行为是" sample.txt"打开并处理第一行,逻辑然后落到"除了"子句。

WAD还是这个错误?

6 个答案:

答案 0 :(得分:6)

如果except块中的代码运行,则是因为引发了异常。你吞下了这个例外,这使得很难知道出了什么问题。

您的错误消息表明您正在尝试捕获文件打开时引发的错误。但由于您的try块围绕文件的整个处理过程,因此处理中引发的异常(而不是文件打开)将被错误地报告为“无法打开文件”。如果你真的必须处理异常,那么你需要将for循环移到except块之后。

就个人而言,我倾向于忽略异常并让异常的默认处理暂停执行:

with open('sample.txt','r') as file:
    for line in file:
        (some action here)

如果必须处理异常,则要辨别您处理的类异常。例如,只处理IOError,因为open会在失败的情况下提升。

try:   
    with open('sample.txt','r') as file:
        for line in file:
            (some action here)
except IOError:
    except IOError as (errno, strerror):
        print "I/O error({0}): {1}".format(errno, strerror)

答案 1 :(得分:3)

然后,open行没有失败。有什么例外吗?

try:
    file=open('sample.txt','r')
    for line in file:
          (some action here)
except:
    print "Exception:"
    import traceback; traceback.print_exc()

file.close()

答案 2 :(得分:2)

except抓住所有例外,包括(some action here)部分中的例外情况。重组为:

try:
    inputfile = open('sample.txt', 'r')
except:
    print "Couldn't open file"
else:
    for line in inputfile: pass
    inputfile.close()

甚至更好:

with open('sample.txt', 'r') as inputfile:
    for line in inputfile: pass

一般情况下,只需在try块中包含尽可能少的代码,这样您就不会意外处理您不准备处理的异常。

答案 3 :(得分:1)

如果由于某种原因open()调用失败,您的代码可能会冒另一个尝试关闭文件的断言。这是因为如果open()引发异常,则不会设置文件变量,因此进一步调用将引用不存在的变量。

如果可能,请尝试使用with语句:

with open('sample.txt', 'r') as file:
    try:
        for line in file:
            (some action)
    except:
        print "Exception"
        import traceback; traceback.print_exc()

这将确保文件在之后关闭,无论with语句中发生了什么。

答案 4 :(得分:0)

尝试使用readlines生成文件中所有行的列表。而且你也不应该在没有打印错误代码的情况下捕获一般错误。

try:
    file=open('sample.txt','r')
    for line in file.readlines():
          (some action here)
except Exception, e:
    print str(e)
file.close()

答案 5 :(得分:0)

  

我观察到的操作是打开“sample.txt”并处理第一行,然后逻辑进入“except”子句。

是的,情况确实如此。但只有文件存在时才会出现

对于落入except子句的错误(假设文件存在),这意味着您实现的解析逻辑存在问题。我们无法确定它是什么,因为except捕获了所有东西,除非它被重新提升(或许不能抓住它......),或者你print the stack trace from the exception object,你不能告诉我们出了什么问题或在哪里。一般来说,这就是为什么抓住一切都不赞成的原因;它使调试变得不必要。

我还注意到你正在关闭文件。这可能是另一个错误来源,因为该文件仅存在于try的范围内。您有两种选择:

  1. file.close()块中加入try,以便在完成后正确关闭文件,或
  2. 使用with语句作为上下文管理器,在完成后自动关闭文件。 @David Heffernan的例子就像我写的那样。