在我编写的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)
上收到了列表索引错误。
答案 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