Python没有正确捕获KeyError

2 投票
1 回答
3591 浏览
提问于 2025-04-16 12:56

我试了同一个函数的两个不同版本:

def position_of(self, table_name, column_name):
    positions = self.heading_positions()
    position = positions['{t}.{c}'.format(t=table_name, c=column_name)]
    return position

-

def position_of(self, table_name, column_name):
    positions = self.heading_positions()
    try:
        position = positions['{t}.{c}'.format(t=table_name, c=column_name)]
    except KeyError:
        raise RuntimeError('No heading found for {t}.{c} in import profile "{ip}"'.format(t=table_name, c=column_name, ip=self))
    return position

在第一个版本中,我遇到了一个错误,这没关系:

Traceback (most recent call last):
  File "./import.py", line 15, in <module>
    g.process()
  File "/home/jason/projects/mcifdjango/mcif/models/generic_import.py", line 39, in process
    row.process()
  File "/home/jason/projects/mcifdjango/mcif/models/csv_row.py", line 18, in process
    self.save()
  File "/home/jason/projects/mcifdjango/mcif/models/csv_row.py", line 26, in save
    self.output("Phone: " + self.value('customer', 'phone'));
  File "/home/jason/projects/mcifdjango/mcif/models/csv_row.py", line 60, in value
    print self.generic_import.import_profile.position_of(table_name, column_name)
  File "/home/jason/projects/mcifdjango/mcif/models/import_profile.py", line 22, in position_of
    position = positions['{t}.{c}'.format(t=table_name, c=column_name)]
KeyError: 'customer.phone'

但是第二个版本——那个错误描述更详细的版本——却没有任何反应。为什么会这样呢?

1 个回答

2

第二个版本的 position_of 对我来说运行得很好。我把它变成了一个简单完整的程序,如下所示:

class Test(object):

    def heading_positions(self):
        return {}

    def position_of(self, table_name, column_name):
        positions = self.heading_positions()
        try:
            position = positions['{t}.{c}'.format(t=table_name, c=column_name)]
        except KeyError:
            raise RuntimeError('No heading found for {t}.{c} in import profile "{ip}"'.format(t=table_name, c=column_name, ip=self))
        return position

a = Test()
a.position_of('customer', 'phone')

当我运行这个程序(在 MacOS X 上使用 Python 2.6.6)时,我得到了如下的错误信息,这是我预期的:

Traceback (most recent call last):
  File "./a.py", line 17, in <module>
    a.position_of('customer', 'phone')
  File "./a.py", line 13, in position_of
    raise RuntimeError('No heading found for {t}.{c} in import profile "{ip}"'.format(t=table_name, c=column_name, ip=self))
RuntimeError: No heading found for customer.phone in import profile "<__main__.Test object at 0x100426ad0>"

这表明捕获 KeyError 并将其转换为 RuntimeError 是有效的。这个例子对你来说也有效吗?正如 Sven 所说,可能的解释是你在调用链的某个地方捕获了 RuntimeError,但没有捕获 KeyError

撰写回答