2017-06-09 3 views
0

ich ein einfaches Python-Telegramm Bot haben, hier ist der Code:Wie behandelt man einen Verbindungsfehler in Anfragen?

import requests 
import json 
from time import sleep 
import os 

filename = 'bot_last_update' 
target = open(filename, 'r') 
update_from_file = target.read() 

# check update from file 
update_from_file = update_from_file.strip() 
last_update = int(update_from_file) 

token = xxxx 
url = 'https://api.telegram.org/bot%s/' % token 

# We want to keep checking for updates. So this must be a never ending loop 
while True: 
    # My chat is up and running, I need to maintain it! Get me all chat updates 
    get_updates = json.loads(requests.get(url + 'getUpdates').content) 
    # Ok, I've got 'em. Let's iterate through each one 
    for update in get_updates['result']: 
     # First make sure I haven't read this update yet 
     if last_update < update['update_id']: 
      last_update = update['update_id'] 
      target = open(filename, 'w') 
      target.truncate() 
      target.write(str(last_update)) 
      target.close() 
      if update['message']['chat']['type'] == 'private': 
      # I've got a new update. Let's see what it is. 
       if update['message']['text'] == 'do something': 
        requests.get(url + 'sendMessage', params=dict(chat_id=update['message']['chat']['id'], text='doing it')) 
        os.system('/srv/scripts/do_something.sh') 
        sleep(10) 
        requests.get(url + 'sendMessage', params=dict(chat_id=update['message']['chat']['id'], text='done!')) 
       else: 
        pass 
    # Let's wait a few seconds for new updates 
    sleep(1) 

Es funktioniert gut, aber jedes Mal, wenn ich ein Problem in meinem Netzwerk habe ich diesen Fehler:

Traceback (most recent call last): 
    File "my_telegram_bot.py", line 21, in <module> 
    get_updates = json.loads(requests.get(url + 'getUpdates').content) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 70, in get 
    return request('get', url, params=params, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 56, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 475, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 596, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 473, in send 
    raise ConnectionError(err, request=request) 
requests.exceptions.ConnectionError: ('Connection aborted.', error(113, 'No route to host')) 

Was wäre, beste Möglichkeit, diesen Fehler zu vermeiden? Ich möchte diesen Bot jederzeit behalten, also sollte er während dieser Art von Ereignissen nicht kritisch ausfallen (oder wenn er dies tut, sollte er automatisch wiederhergestellt/neu gestartet werden).

+0

Wenn Sie den Fehler vermeiden möchten, müssen Sie das Problem im Netzwerk (möglicherweise Firewall) herausfinden. Wenn Sie den Fehler behandeln möchten (versuchen Sie es automatisch wiederherzustellen), sollten Sie einen Block [try/except] (https://docs.python.org/3/tutorial/errors.html#handling-exceptions) hinzufügen . – etemple1

Antwort

1

Sie müssen einen Wiederholungsmechanismus implementieren. Hier ist ein Beispiel in Python How to retry after exception in python?. Ein Wiederholungsmechanismus wird den Bot aufrechterhalten und den Fehler vermeiden, wenn die Verbindung sich in einer angemessenen Zeit selbst korrigiert.

Auschecken Python requests exception handling für ein Beispiel zum Abfangen Ihrer spezifischen Ausnahme.

Die Kombination der beiden Beispiele, die wir erhalten:

from requests import ConnectionError 
import requests 
import json 
from time import sleep 
import os 
connection_timeout = 30 # seconds 

...

# My chat is up and running, I need to maintain it! Get me all chat updates 
start_time = time.time() 
while True: 
    try: 
     get_updates = json.loads(requests.get(url + 'getUpdates').content) 
     break 
    except ConnectionError: 
     if time.time() > start_time + connection_timeout: 
      raise Exception('Unable to get updates after {} seconds of ConnectionErrors'.format(connection_timeout)) 
     else: 
      time.sleep(1) # attempting once every second 
# Ok, I've got 'em. Let's iterate through each one 

...

Dies wird versuchen getUpdates jede Sekunde für 30 Sekunden, bis die Anschlussrechte Aufruf selbst . Sie können den Wert von connection_timeout so groß oder klein einstellen, dass die unterbrochene Verbindung abgedeckt wird.

Verwandte Themen