处理Python中的详细异常

时间:2011-10-10 06:45:03

标签: python exception-handling

我正在处理从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)时出现异常,则意味着.xls文件的特定行中存在一些错误。但是当我打印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'

这是XLS文件中的单词。如果我不能显示哪个行错误引起,如果我至少显示上面的单词,将有助于找到该单词并删除该单词。 我无法从exc_info()得到那个特定的词,或者他们有更好的方法来处理这种情况吗?

1 个答案:

答案 0 :(得分:1)

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