间歇性KeyError引发并无法重现它

时间:2012-05-09 14:39:32

标签: python

我尝试用一​​些更简单的功能重现它但没有成功。因此,下面的代码显示了KeyError的相关方法,这些方法很多都是由我们的生产服务器抛出的。

class PokerGame:
...
    def serialsNotFold(self):
        return filter(lambda x: not self.serial2player[x].isFold(), self.player_list)

    def playersNotFold(self):
        return [self.serial2player[serial] for serial in self.serialsNotFold()]
...

这是Traceback。

Traceback (most recent call last):
  File "/usr/lib/python2.6/dist-packages/pokernetwork/pokertable.py", line 945, in update
    try: self.game.historyReduce()
  File "/usr/lib/python2.6/dist-packages/pokerengine/pokergame.py", line 3949, in historyReduce
    self.turn_history = PokerGame._historyReduce(self.turn_history,self.moneyMap())
  File "/usr/lib/python2.6/dist-packages/pokerengine/pokergame.py", line 1323, in moneyMap
    money = dict((player.serial,player.money) for player in self.playersNotFold())
  File "/usr/lib/python2.6/dist-packages/pokerengine/pokergame.py", line 3753, in playersNotFold
    return [self.serial2player[serial] for serial in self.serialsNotFold()]
KeyError: 21485L
  • self.player_list是一个包含连续出版物的列表
  • self.serial2player是一个将连续剧映射到Player对象的词典

现在不可能在playersNotFold中引发KeyError,因为因此必须在serialsNotFold中引发相同的错误,而不是。

我问了我的2个同伴和#python上的人,但没有人能够证明这是怎么发生的。

如果您需要完整的来源:https://github.com/pokermania/poker-network/

修改 问题是我们打印了traceback.format_exc(limit = 4),它从顶部而不是从底部开始限制。最后2个调用隐藏的地方,所以看起来像playersNotFold提出异常。

这是一个完整的痕迹。

Traceback (most recent call last): 
  File "/usr/lib/python2.7/pokernetwork/pokertable.py", line 704, in update 
    try: self.game.historyReduce() 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 3953, in historyReduce 
    self.turn_history = PokerGame._historyReduce(self.turn_history,self.moneyMap()) 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 1327, in moneyMap 
    money = dict((player.serial,player.money) for player in self.playersNotFold()) 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 3757, in playersNotFold 
    return self.serial2player[serial] for serial in self.serialsNotFold()] 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 3754, in serialsNotFold 
    return filter(lambda x: not self.serial2player[x].isFold(] self.player_list) 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 3754, in <lambda> 
    return filter(lambda x: not self.serial2player[x].isFold(] self.player_list) 
KeyError: 1521

我很抱歉浪费你的时间:/

1 个答案:

答案 0 :(得分:0)

我猜你使用线程并且self.serial2player被另一个线程修改。