Неуловимое исключение в Python - PullRequest
1 голос
/ 11 февраля 2010

Проблема возникла в этом вопросе , который я повторю в этом коде:

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 в файл вызывает исключение "uncatchable".

Вопрос, кроме того, что сначала очистить файл, как лучше всего справиться с этим? Насколько распространены «неуловимые» исключения?

Ответы [ 4 ]

7 голосов
/ 11 февраля 2010

Вы не ставите блок try в нужное место, чтобы поймать это исключение. Другими словами, это исключение «ловимо», просто вернитесь к вопросу, на который вы ссылались.

В трассировке четко указано, что проблема связана с оператором for.

4 голосов
/ 11 февраля 2010

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

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.

0 голосов
/ 11 февраля 2010

Попробуйте это:

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 голосов
/ 11 февраля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...