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
我的 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