Обработка подробных исключений в Python - PullRequest
0 голосов
/ 10 октября 2011

Я обрабатываю чтение данных из файла test.xls следующим образом:

from sys import exe_info
    try:
        book = xlrd.open_workbook('test.xls')
        sh = book.sheet_by_index(0)
        for row in range( 1, sh.nrows ):
            for index, value in enumerate(sh.row_values(row)):
                process_value(value)
    except:
        print exc_info()[1]

Если во время обработки возникает исключение, process_value(value) означает, что в этой конкретной строке * 1006 что-то не так* file.but, когда я печатаю exc_info()[1], я могу получить описание исключения как

'ascii' codec can't encode characters in position 7-10: ordinal not in range(128)

, но если я печатаю функцию exc_info(), это дает следующий вывод

(<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u'bokor b\xe3\u0192\xe2\xa9la', 7, 11, 'ordinal not in
range(128)'), <traceback object at 0x01067080>)

Так что, если я хочу показать исключение для пользователя, то пользователь заинтересован в конкретной строке файла that.xls, которая вызывает ошибку. Так что при выводе exc_info() я вижу слово

u'bokor b\xe3\u0192\xe2\xa9la'

Thisэто слово из файла XLS.Если мы не можем показать, для какой строки возникает ошибка, если я, по крайней мере, покажу это слово выше, это поможет найти это слово и удалить это слово.Я не могу получить это конкретное слово от exc_info() или есть какой-то лучший способ справиться с этой ситуацией?

1 Ответ

1 голос
/ 10 октября 2011

xlrd возвращает содержимое всех текстовых ячеек в виде unicode объектов.Вам не нужно знать «правильную кодировку» - она ​​НЕ кодируется.

Я предлагаю вам сделать что-то вроде этого:

for row in xrange(1, sh.nrows):
    for index, value in enumerate(sh.row_values(row)):
        try:
            process_value(value)
        except:
            print >> sys.stderr, row, index, repr(value)
            raise

Это позволит вам отобразить все соответствующие данные, а затем повторно вызвать исключение, чтобы вы получили отформатированное сообщение об ошибке и трассировкусделано для вас.

Вероятно, это значительно помогло бы вам, если бы вы показали нам код своей функции process_value - вы пытаетесь unicode_object.encode('ascii') явно или неявно?

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