0

我正在为我的 willie irc 机器人做一个模块,它使机器人在论坛的给定线程中出现新帖子时发出一条消息。实际上,我遇到的问题很奇怪:机器人每隔一段时间就会返回一个未处理的异常:

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

您认为哪个选项更好?我想最终以“专业”的方式开始编码,而不是让菜鸟变通。如果你有自己的想法,请说出来。

谢谢!

4

2 回答 2

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顶部

于 2013-08-02T19:35:42.657 回答
0

您的问题似乎feedparser.parse是没有返回任何条目。我不会将整个 while 循环包装在 try except 语句中,而是确保返回超过 0 个条目。

我会feedparser.parse('http://forums.wesnoth.org/feed.php?t=39175')用这个替换你的while循环:

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

这应该可以防止您获得异常,并具有记录信息的额外优势,因此您可以确定您没有获得任何条目的原因。

feedparser.parse您也可以在 while 循环之外对您的调用执行相同的操作,只需替换continuereturn.

于 2013-08-02T19:36:36.133 回答