问题出现在question中,我将在此代码中重述:
import csv
FH = open('data.csv','wb')
line1 = [97,44,98,44,99,10]
line2 = [100,44,101,44,102,10]
for n in line1 + line2:
FH.write(chr(n))
FH.write(chr(0))
FH.close()
import _csv
FH = open('data.csv')
reader = csv.reader(FH)
for line in reader:
if '\0' in line: continue
if not line: continue
try:
print line
except _csv.Error:
print 'error'
运行它:
$ python test.py
['a', 'b', 'c']
['d', 'e', 'f']
Traceback (most recent call last):
File "test.py", line 14, in <module>
for line in reader:
_csv.Error: line contains NULL byte
所以,我想在文件中包含NUL会导致“无法捕获”的异常。
问题是,除了首先清理文件之外,处理这个问题的最佳方法是什么? “无法捕获”的例外有多常见?
答案 0 :(得分:7)
您没有将“try”块放在正确的位置以捕获此异常。换句话说,这个例外是“可捕获的”,只是重新审视你引用的问题。
回溯明确指出问题与“for”语句一致。
答案 1 :(得分:4)
它不是无法捕捉的,你只是想在错误的地方捕捉它。错误发生在以下行中:
for line in reader:
并且你正在尝试阻止:
print line
此时已经提出了例外情况。
您可以如其他答案所示包装整个块,或者通过扭曲循环来手动操作csv阅读器的迭代来隔离异常:
while 1:
try:
line = f.next()
except StopIteration:
break
except csv.Error:
print "Error occurred"
process_line(line)
这有损于可读性,有利于将异常处理限制为相关的代码位。可能过度使用csv.error特有的异常,但在尝试隔离IOError时它是一种方便的技术。
答案 2 :(得分:0)
抛出异常的代码不在try / except。
中Traceback (most recent call last):
File "test.py", line 14, in <module>
for line in reader:
就像回溯显示的那样,从阅读器中检索下一行是导致异常的原因。您需要尝试整个for
。
答案 3 :(得分:0)
试试这个:
FH = open('data.csv')
try:
reader = csv.reader(FH)
for line in reader:
if '\0' in line: continue
if not line: continue
print line
except _csv.Error:
print 'error'