民间,
我已经辞职以解决这个问题,但我想检查一下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还是这个错误?
答案 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
的范围内。您有两种选择:
file.close()
块中加入try
,以便在完成后正确关闭文件,或with
语句作为上下文管理器,在完成后自动关闭文件。 @David Heffernan的例子就像我写的那样。