Python:IRC 机器人在仅发送前缀时崩溃

Python: IRC bot crashes when only prefix is sent

我的 IRC 机器人在我只发送前缀 (!) 时崩溃

我明白为什么会这样,但我不知道如何让它忽略它而不是杀死它。

来源:https://github.com/SamWilber/rollbot/blob/master/rollbot.py

错误:

:turtlemansam!~turtleman@unaffiliated/turtlemansam PRIVMSG #tagprobots :!
Traceback (most recent call last):
line 408, in <module>
    bot.connect()
line 81, in connect
    self.run_loop()
line 117, in run_loop
    self.handle_message(source_nick, message_dict['destination'], message_dict['message'])
in handle_message
    self.handle_command(source, destination, message)
line 139, in handle_command
    command_key = split_message[0].lower()
IndexError: list index out of range

罪魁祸首是那个片段:

def handle_command(self, source, destination, message):
    split_message = message[1:].split()
    command_key = split_message[0].lower() # L139
    …

这是因为当你只发送前缀时,前缀后面没有 "right hand side" 部分。所以当你试图拆分那个不存在的 RHS 部分时,相当于做了以下操作:

>>> "".split()[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

不好,嗯?

所以解决方案是在这个阶段添加异常处理:

try:
    split_message = message[1:].split()
    command_key = split_message[0].lower()
except IndexError:
    print("No Command")
    return
…

不过,我个人的偏好是检查 split_message 的长度,因为这不是 异常 行为,而是一个可能的用例场景:

split_message = message[1:].split()
if len(split_message) is 0:
    print("No Command")
    return
else:
    command_key = split_message[0].lower()
    …

在 python 中,异常被认为是无成本的(就 memory/processor 开销而言),因此通常鼓励使用它们。

不过,如果我的偏好超过了在这种情况下不使用异常,那是因为:

  • 当你编写算法时,总是将用例可能性集成到执行流程中,而不是破坏执行流程(这是 excption 所做的),因为它提高了代码的可读性......
  • 并且它避免了隐藏另一个异常的可能性。

HTH