每20分钟或每秒列出索引超出范围错误

2024-10-01 13:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

在我正在编写的IRC bot中,有两个函数可以检索发送消息的用户和发送的消息。它通过将发送到bot的读取缓冲行分成两部分来实现,然后使用第二个列表索引来检索用户/消息。以下是代码的第一部分:

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!"

如您所见,我试图形成一种方法,在服务器没有任何可接收的内容时,阻止自己从服务器超时;这就是问题的根源。它将检索一行nothing,然后尝试拆分nothing,然后尝试访问超出范围的列表索引。我有一个想法,这可能可以通过使用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)行上得到了列表索引错误。你知道吗


Tags: 函数用户in消息message列表botline
2条回答

我认为您的问题在以下几行(除了没有检查line是否为空字符串之外,可能是,如gariepy的回答所示):

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

以及

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

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

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应用split之前检查它是否为非空字符串,如另一个答案所示。希望有帮助。你知道吗

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

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!"

空字符串list(或None)的计算结果将为False,因此代码将停止并打印您的消息(如果您不喜欢我所做的工作,也可以重新构造if语句)。任何非空字符串/列表或文本将计算为“True”,并继续执行下一个if检查。你知道吗

编辑:

添加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

相关问题 更多 >