Python中无法捕获的异常

时间:2010-02-11 14:56:09

标签: python exception

问题出现在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会导致“无法捕获”的异常。

问题是,除了首先清理文件之外,处理这个问题的最佳方法是什么? “无法捕获”的例外有多常见?

4 个答案:

答案 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'