Неуловимое исключение в Python

1

Проблема возникла в этом 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 в файл вызывает "неуловимое" исключение.

Вопрос в том, что, прежде всего, сначала продезинфицировать файл, какой лучший способ справиться с этим? Насколько распространены "неуловимые" исключения?

  • 1
    Это не "uncatchable", это модуль csv, который вызывает ошибку.
  • 1
    Это ЛЮБЫЕ неуловимые исключения в Python?
Показать ещё 1 комментарий
Теги:
exception

4 ответа

7
Лучший ответ

Вы не помещаете блок "try" в нужное место, чтобы поймать это исключение. Другими словами, это исключение является "захватывающим", просто перейдите к вопросу, на который вы ссылались.

В трассировке четко указано, что проблема находится в строке с инструкцией "для".

4

Это не сложно, вы просто пытаетесь поймать его не в том месте. Ошибка возникает в строке:

for line in reader:

и вы помещаете блок try вокруг:

print line

Исключение уже было поднято на этом этапе.

Вы можете обернуть весь блок, как показано в других ответах, или изолировать исключение, деформируя цикл, чтобы вручную манипулировать итерацией вашего считывателя csv:

while 1:
    try:
        line = f.next()
    except StopIteration:
        break
    except csv.Error:
        print "Error occurred"
    process_line(line)

Это ущемляет читаемость в пользу ограничения обработки исключений на соответствующий бит кода. Вероятно, излишнее исключение, такое как csv.error, но это удобный метод при попытке изолировать, например, IOError.

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'
0

Код, который бросает исключение, находится не внутри try/except.

Traceback (most recent call last):
  File "test.py", line 14, in <module>
    for line in reader:

Так же, как показывает трассировка, получение следующей строки от читателя является причиной исключения. Вам нужно, чтобы весь for попытался.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню