我正在为我的willie irc bot做一个模块,只要在论坛的给定帖子中出现新帖子,机器人就会发出消息。我遇到的问题非常奇怪,实际上:机器人偶尔会返回一个未处理的异常:
Unhandled exception in thread started by <function lurk at 0x10ebfa8c0>
Traceback (most recent call last):
line 27, in lurk
d=c.entries[0].published
IndexError: list index out of range
每隔一段时间我的意思就是:错误随机出现。通常大约30分钟,但一旦完全没有出现整整1.5小时的会话。我对如何处理这个问题有一些想法,但让我们首先看看我的代码:
import willie
import time
import thread
import feedparser
...
@willie.module.commands('startlurking')
def startlurking(bot, trigger):
def lurk():
bot.say("Right away, sir.")
a=feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
b=a.entries[0].published
while True:
c=feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
d=c.entries[0].published #this is the line 27
if not d==b:
bot.say(trigger.nick + ", I have spotted a new post!")
bot.say(c.entries[0].link)
bot.say(c.entries[0].description)
b=d
time.sleep(10)
thread.start_new_thread(lurk, ())
我的第一个想法是10秒的睡眠不足以让我的机器人解析rss。这里有没有人从他们的经验中知道什么时间金额是100%安全的?
第二个想法是忽略错误并做出一个不做任何事情的异常,不会制动循环并只重试整个事情。这会有用吗?
try:
#here goes the while loop
except:
Pass
您认为哪个选项更好?我想最终以“专业”的方式开始编码,而不是让noob解决问题。如果你有自己的想法,请说出来。
谢谢!
答案 0 :(得分:1)
如果d.entries
列表中没有项目,则会发生此错误。例如在你的控制台中:
>>> entries = []
>>> entries[0]
... IndexError: list index out of range
要避免此错误,请在继续之前检查是否找到了条目。例如,您可以将循环更改为以下内容:
while True:
time.sleep(10)
c=feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
if not c.entries:
# no entries found, re-enter the loop at the "sleep"
continue
# entries found, process them...
注意我已将sleep
移至顶部
答案 1 :(得分:0)
似乎您的问题是feedparser.parse
没有返回任何条目。不是将整个while循环包装在try except语句中,而是确保返回超过0个条目。
我会用你的while循环替换feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
:
import logging
...
c = feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')
if not len(c.entries):
# You can use your own logger instance instead
# Log any information you need to identify the real problem
logging.error("No entries found: %s", str(c))
continue
这可以防止您获得的例外情况,并具有记录信息的附加优势,因此您可以确定未获得任何条目的原因。
您也可以在while循环之外的feedparser.parse
调用中执行相同操作,只需将continue
替换为return
。