Search code examples
pythonexceptionpraw

How to fix 'During handling of the above exception, another exception occurred:' Error in Python?


I'm trying to create a reddit bot that checks the latest comments in a subreddit, and if the comment contains a misquote, I want the bot to reply with the actual quote. My problem is that after my bot waits for a couple minutes due to the reddit timeout, after the wait is over, it throws an exception error.

I've tried to make it only handle one exception at a time by making an exc variable, and setting it to 0 or 1, but that hasn't worked.

Here is my code (excluding identifying info) :

import praw
import re
import time
import os

reddit = praw.Reddit(client_id= 'id',
                     client_secret= 'secret',
                     user_agent='<console: reddit_bot: 0.0.1 (by /u/username)>',
                     username= 'username',
                     password= 'password'
                     )
if not os.path.isfile("comments_replied_to.txt"):
        comments_replied_to = []
else:
    with open("comments_replied_to.txt", "r") as f:
        comments_replied_to = f.read()
        comments_replied_to = comments_replied_to.split("\n")
        comments_replied_to = filter(None, comments_replied_to)


subreddit = reddit.subreddit('subreddit')
pos=0
exc = 0

keywords = [ 'Luke, I am your father', 'Do you feel lucky, punk?']


for comment in subreddit.stream.comments():
    for keyword in keywords:
        if keyword in comment.body and comment.id not in comments_replied_to and comment.author != 'thatotteraccount':
            print("String with " + keyword + " found in comment " + comment.id)
            if keyword == 'Luke, I am your father':
                if exc==0:
                    try:
                        comment.reply('* "No, I am your Father."')
                    except praw.exceptions.APIException as e:
                        exc=1
                        if (e.error_type == "RATELIMIT"):
                            delay = re.search("(\d+) minutes", e.message)

                            if delay:
                                delay_seconds = float(int(delay.group(1)) * 60)
                                time.sleep(delay_seconds)
                                comment.reply('* "No, I am your Father."')
                                exc=0
                            else:
                                delay = re.search("(\d+) seconds", e.message)
                                delay_seconds = float(delay.group(1))
                                time.sleep(delay_seconds)
                                comment.reply('* "No, I am your Father."')
                                exc=0

            if keyword == 'Do you feel lucky, punk?':
                if exc==0:
                    try:
                        comment.reply('* "Youve got to ask yourself one question: Do I feel lucky? Well, do ya punk?" ')
                    except praw.exceptions.APIException as e:
                        exc=1
                        if (e.error_type == "RATELIMIT"):
                            delay = re.search("(\d+) minutes?", e.message)

                            if delay:
                                delay_seconds = float(int(delay.group(1)) * 60)
                                time.sleep(delay_seconds)
                                comment.reply('* "Youve got to ask yourself one question: Do I feel lucky? Well, do ya punk?" ')
                                exc=0
                            else:
                                delay = re.search("(\d+) seconds", e.message)
                                delay_seconds = float(delay.group(1))
                                time.sleep(delay_seconds)
                                comment.reply('* "Youve got to ask yourself one question: Do I feel lucky? Well, do ya punk?" ')
                                exc=0
            print("Replied to comment" + comment.id)

            list(comments_replied_to).append(comment.id)
            with open ("comments_replied_to.txt", "a") as f:
                f.write(comment.id + "\n")

the error that it throws out is:

    File "C:\Users\Blaze\Desktop\reddit_bot2.py", line 56, in <module>
    comment.reply('* "Youve got to ask yourself one question: Do I feel lucky? Well, do ya punk?" ')
  File "C:\Users\Blaze\AppData\Local\Programs\Python\Python37-32\lib\site-packages\praw\models\reddit\mixins\replyable.py", line 26, in reply
    return self._reddit.post(API_PATH['comment'], data=data)[0]
  File "C:\Users\Blaze\AppData\Local\Programs\Python\Python37-32\lib\site-packages\praw\reddit.py", line 483, in post
    return self._objector.objectify(data)
  File "C:\Users\Blaze\AppData\Local\Programs\Python\Python37-32\lib\site-packages\praw\objector.py", line 149, in objectify
    raise APIException(*errors[0])
praw.exceptions.APIException: RATELIMIT: 'you are doing that too much. try again in 8 minutes.' on field 'ratelimit'

__During handling of the above exception, another exception occurred:__

Traceback (most recent call last):
  File "C:\Users\Blaze\Desktop\reddit_bot2.py", line 65, in <module>
    comment.reply('* "Youve got to ask yourself one question: Do I feel lucky? Well, do ya punk?" ')
  File "C:\Users\Blaze\AppData\Local\Programs\Python\Python37-32\lib\site-packages\praw\models\reddit\mixins\replyable.py", line 26, in reply
    return self._reddit.post(API_PATH['comment'], data=data)[0]
  File "C:\Users\Blaze\AppData\Local\Programs\Python\Python37-32\lib\site-packages\praw\reddit.py", line 483, in post
    return self._objector.objectify(data)
  File "C:\Users\Blaze\AppData\Local\Programs\Python\Python37-32\lib\site-packages\praw\objector.py", line 149, in objectify
    raise APIException(*errors[0])
praw.exceptions.APIException: RATELIMIT: 'you are doing that too much. try again in 6 seconds.' on field 'ratelimit'

Any and all help is appreciated, thank you.


Solution

  • It seems to me like you are waiting exactly the amount of time that it tells you to wait, but that Reddit has not finished cooling down. You should probably add like 10-30 seconds to your sleep time.