处理Python中的详细异常
我正在处理从 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')
呢?