处理Python中的详细异常

0 投票
1 回答
734 浏览
提问于 2025-04-17 04:00

我正在处理从 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 个回答

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

撰写回答