每20分钟左右列出索引超出范围错误

时间:2016-03-08 03:32:09

标签: python list indexing

在我编写的IRC机器人中,我有两个函数可以检索发送消息的用户和发送的消息。它通过将发送到机器人的读缓冲区行分成两部分来完成此操作,然后使用第二个列表索引来检索用户/消息。这是代码的第一部分:

def getUser(line):
    if "!" in line:
        separate = line.split(":", 2)
        user = separate[1].split("!", 1)[0]
        return user
    else:
        print "Nothing to receive from the server!"
def getMessage(line):
    if ':' in line:
        separate = line.split(":", 2)
        message = separate[2]
        return message
    else:
        print "Nothing to receive from the server!"

正如您所看到的,当没有任何东西可以从服务器接收时,我试图形成一种阻止自己从服务器超时的方法;这就是问题的根源所在。它将检索一行无关,然后尝试拆分任何内容,然后尝试访问超出范围的列表索引。我有一个想法,这可能是使用try/catch语句完成的,但我是Python的新手并且对此并不了解。这是访问函数的其余代码,如果它有帮助:

readbuffer = readbuffer + s.recv(1024)
temp = string.split(readbuffer, "\n")
readbuffer = temp.pop()

for line in temp:
    user = getUser(line)
    message = getMessage(line)

我在行message = getMessage(line)user = getUser(line)上收到了列表索引错误。

2 个答案:

答案 0 :(得分:3)

我认为您的问题出在这些方面(可能除了之外没有检查line是否为空字符串,如Gariepy的回答所示):

separate = line.split(":", 2)
user = separate[1].split("!", 1)[0]

separate = line.split(":", 2)
message = separate[2]

在第一种情况下,您假设separate至少有2个元素(因为您在split上使用separate[1]),而在第二种情况下,您假设separate 1}}至少包含3个元素(因为您在split上使用separate[2])。在访问这些索引之前,您应该首先检查它们的长度,如下所示:

separate = line.split(":", 2)
if len(separate) >= 2:
    user = separate[1].split("!", 1)[0]

separate = line.split(":", 2)
if len(separate) >= 3:
    message = separate[2]

此外,请记住在对其应用拆分之前检查line是否为非空字符串,如另一个答案所示。希望有所帮助。

答案 1 :(得分:1)

一个简单的解决方案是在使用之前检查线是否为空:

def getUser(line):
    if line:
        if "!" in line:
            separate = line.split(":", 2)
            user = separate[1].split("!", 1)[0]
            return user
    print "Nothing to receive from the server!"
def getMessage(line):
    if line:
        if ':' in line:
            separate = line.split(":", 2)
            message = separate[2]
            return message
    print "Nothing to receive from the server!"

空字符串,列表(或无)将评估为False,因此代码将停在那里并打印您的消息(或者如果您不喜欢我所做的,您可以重构if语句)。任何非空字符串/列表或文字将评估为" True"如果检查则继续进行下一步。

编辑:

添加try / except:

def getUser(line):
    try:
        if line:
            if "!" in line:
                separate = line.split(":", 2)
                user = separate[1].split("!", 1)[0]
                return user
        print "Nothing to receive from the server!"
    except (IndexError as e):
        print e
    except:
        print "Unexpected error:", sys.exc_info()[0]
        raise