在“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”循环的主要内容,如果未能解决你的问题,请参考以下文章