2017-12-15 1 views
0

Ich habe einen Telegramm-Bot in Python geschrieben, der auf meinem Raspberry Pi (Raspbian) läuft. Ich sehe schließlich einen Fehler, nachdem der Bot für ein paar Stunden ausgeführt wurde.Python Telegram Bot - KeyError nach ein paar Stunden Laufzeit

Bevor ich den vollständigen Code poste, könnte mir bitte jemand helfen, den Fehler zu verstehen? Ich möchte den Bot auf unbestimmte Zeit oder zumindest für mehrere Tage laufen lassen, bevor ich ihn neu starten muss.

Der Fehler ist wie folgt:

Traceback (most recent call last): 
    File "/home/pi/Schreibtisch/StreamrPreisBot/telepot/loop.py", line 37, in run_forever 
    self._handle(msg) 
    File "/home/pi/Schreibtisch/StreamrPreisBot/streamrinfobot.py", line 32, in handle 
    command = msg['text'] 
KeyError: 'text' 

Edit: folgenden Code verwendet wird:

def handle(msg): 
    chat_id = msg['chat']['id'] 
    command = msg['text'] 

könnte dieser Code das Problem zu lösen?

def handle(msg): 
    chat_id = msg['chat']['id'] 
    command = msg.get('text') 
+0

sollten Sie auch den Code veröffentlichen, der diesen Fehler erzeugt. –

+0

Ich würde gerne helfen, die Ursache des Fehlers aufzuspüren, wenn Sie zumindest den Code für '_handle (msg)' in 'loop.py' posten. – ndmeiri

Antwort

0

A KeyError ausgelöst wird, wenn ein Wert von einem dict beantragt, aber der Schlüssel existiert nicht im Wörterbuch. In Ihrem Fall hat das msg Wörterbuch nicht den Schlüssel text.

Sie sollten Ihren Code überprüfen, um sicherzustellen, dass das msg Wörterbuch einen Wert enthält, der mit dem Schlüssel text verknüpft ist. Oder, wenn Sie erwarten, dass msg manchmal den Schlüssel text nicht enthält, sollten Sie stattdessen auf das Wörterbuch mit der get-Methode zugreifen, die nie eine KeyError auslöst. Weitere Informationen finden Sie unter the docs.

+0

@ SurvivorX Bevor Sie sich für die Methode 'get' entscheiden, müssen Sie bestimmen, warum das Wörterbuch den' text' Schlüssel nicht enthält. Wenn Sie erwarten, dass es immer den 'text'-Schlüssel enthält, ist Ihr Fehler eigentlich woanders. Es zeigt sich gerade auf diese Weise. Also, bitte sag mir, erwartest du, dass der 'text' Schlüssel immer da ist? – ndmeiri

+0

Da der Bot hat die Erlaubnis, jede einzelne Nachricht in den Gruppen zu lesen, die es verwendet wird, sollte der Textschlüssel eigentlich immer gegeben werden, ich denke – SurvivorX

+0

@ SurvivorX ich sehe. Es klingt also so, als wäre die Quelle Ihres Fehlers woanders. Daher würde ich die "get" -Methode vorerst vermeiden, weil dadurch die Ausnahme zum Schweigen gebracht wird. Versuchen Sie stattdessen, den Grund herauszufinden, warum der 'text' Schlüssel nicht in der' msg' existiert. – ndmeiri

1

Fehler sagt, es gibt keine text Schlüssel innerhalb msg dict. Vielleicht ist es eine spezielle Telegramm-Nachricht, die keinen Text enthält oder es gibt einen Fehler in Ihrem Code, der in einigen Fällen den Schlüssel text löscht. Sie könnten

command = msg.get('text') 

verwenden, um None zu erhalten, wenn es keinen Text gibt. Oder

command = msg.get('text', '') 

leeren String zu erhalten (das heißt ''), wenn kein Text ist.

Sie können auch überprüfen, dass es eine text innerhalb msg oder nicht mit in Betreiber:

if 'text' not in msg: 
    logger.error('bad message received!') 
    return 

Wenn Sie wollen Ihren Service immer bis zu sein, sollten Sie einen Mechanismus für den automatischen Neustart hinzufügen.

wie in Python nach jedem Fehler neu zu starten:

while True: 
    try: 
     logger.info("Starting bot") 
     run_bot() 
    except Exception: 
     logger.exception("Something bad happened. Restarting") 

Ich schlage vor, auch Fehler in einer Datei oder Dienste anmelden wie Sentry zu untersuchen, warum danach kein Text ist.