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

Posted

技术标签:

【中文标题】在“try”运算符中嵌套“for”循环【英文标题】:Nesting "for" loop within a "try" operator 【发布时间】:2012-02-09 22:19:49 【问题描述】:

伙计们,

我已经辞职来解决这个问题,但我想检查 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”并处理第一行,然后逻辑进入“except”子句。

WAD 还是这是一个错误?

【问题讨论】:

您应该始终捕获特定异常,例如 FileNotFoundException。不要只是包罗万象,否则你会遇到这样的问题,你不知道为什么会失败。 for 循环中的确切代码是什么? 【参考方案1】:

如果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)

【讨论】:

5 秒领先!谁会赢得比赛??【参考方案2】:

那么,open 行并没有失败。有什么例外?

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

file.close()

【讨论】:

【参考方案3】:

裸露的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 块内包装尽可能少的代码,这样您就不会意外处理您没有真正准备好处理的异常。

【讨论】:

【参考方案4】:

如果由于某种原因 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 语句中发生什么。

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

是的,就是这样。但这只有只要文件存在才会发生。

至于except 子句的错误(假设文件存在),这意味着您实现的解析逻辑存在问题。我们无法确定它是什么,因为 except 捕捉到了所有东西,除非它被重新加注(然后可能不捕捉它......),或者你 print the stack trace from the exception object,你无法判断发生了什么错误或在哪里。总的来说,这就是为什么不赞成捕捉所有内容的原因。它使调试变得不必要的困难。

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

    try 块中包含 file.close(),以便在完成后正确关闭文件,或者 使用with 语句作为上下文管理器,在您完成后自动关闭文件。 @David Heffernan 的示例与我要编写的示例类似。

【讨论】:

以上是关于在“try”运算符中嵌套“for”循环的主要内容,如果未能解决你的问题,请参考以下文章

for循环执行顺序?

逗号运算符do while循环嵌套循环数组简介

今日所学

python考前复习,python基础语法知识点整理

Python判断循环语法

第三天