From 09882562399fbebd1bac8966f1d6bd0c89c72da9 Mon Sep 17 00:00:00 2001 From: michivonah Date: Sat, 12 Oct 2024 17:30:47 +0200 Subject: [PATCH] improved exception & error handling #1 --- main.py | 75 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/main.py b/main.py index e404edd..b2958f1 100644 --- a/main.py +++ b/main.py @@ -26,41 +26,63 @@ def sendMessage(message, notificationType): header = { "Authorization":f"Bearer {accessToken}" } - response = requests.post(url=endpoint, headers=header, data=message) - else: response = requests.post(url=endpoint, data=message) + try: + response = requests.post(url=endpoint, headers=header, data=message) + except Exception as error: + raise Exception(f"Got an error while sending the notification: {error}") + else: + try: + response = requests.post(url=endpoint, data=message) + except Exception as error: + raise Exception(f"Got an error while sending the notification: {error}") return response case "discord" | _: endpoint = os.getenv('DISCORD_WEBHOOK') data = { "content": message, } - response = requests.post(url=endpoint, json=data) - return response + try: + response = requests.post(url=endpoint, json=data) + return response + except Exception as error: + raise Exception(f"Got an error while sending the notification: {error}") # Check for the current waiting times def checkTimes(subscribedAttractions, themepark): - endpoint = "https://api.wartezeiten.app/v1/waitingtimes" + try: + endpoint = "https://api.wartezeiten.app/v1/waitingtimes" - header = { - "language":"de", - "park":themepark - } + header = { + "language":"de", + "park":themepark + } - req = requests.get(url=endpoint, headers=header) - result = req.json() - attractions = result - for attraction in attractions: - if attraction["code"] in subscribedAttractions: - if attraction["status"] == "opened": - refreshTime = 30 - if not attraction["code"] in currentTimes: currentTimes[attraction["code"]] = attraction["waitingtime"]; - if currentTimes[attraction["code"]] > attraction["waitingtime"]: - sendMessage(f"Waiting time of {attraction['name']} sank to {attraction['waitingtime']} Minutes!", notificationType) - elif currentTimes[attraction["code"]] < attraction["waitingtime"]: - sendMessage(f"Waiting time for {attraction['name']} increased to {attraction['waitingtime']} Minutes!", notificationType) - currentTimes[attraction["code"]] = attraction["waitingtime"] + req = requests.get(url=endpoint, headers=header) + except: + raise Exception(f"API Request to endpoint {endpoint} failed.") + try: + result = req.json() + except: + raise Exception("Format of API response is invalid. (JSON expected)") + try: + attractions = result + for attraction in attractions: + if isinstance(attraction, dict) and "code" in attraction: + if attraction["code"] in subscribedAttractions: + if attraction["status"] == "opened": + refreshTime = 30 + if not attraction["code"] in currentTimes: currentTimes[attraction["code"]] = attraction["waitingtime"]; + if currentTimes[attraction["code"]] > attraction["waitingtime"]: + sendMessage(f"Waiting time of {attraction['name']} sank to {attraction['waitingtime']} Minutes!", notificationType) + elif currentTimes[attraction["code"]] < attraction["waitingtime"]: + sendMessage(f"Waiting time for {attraction['name']} increased to {attraction['waitingtime']} Minutes!", notificationType) + currentTimes[attraction["code"]] = attraction["waitingtime"] + else: + refreshTime = 180 else: - refreshTime = 180 + print(f"Info: Attraction was skipt because it has an invalid data structure. Affacted attraction: {attraction}") + except Exception as error: + raise Exception(f"Got an error while checking for differences since the last API call. Error: {error}") # Main Loop # Checks every 30 seconds for changes in the waiting times of the subscribed attractions @@ -70,7 +92,10 @@ if __name__ == '__main__': print("By Michi von Ah") print("Big thanks to the wartezeiten.app API!") while True: - checkTimes(subscribedAttractions, themepark) - print(f"Checked for updates at {time.strftime('%H:%M:%S', time.localtime())}") + try: + checkTimes(subscribedAttractions, themepark) + print(f"Checked for updates at {time.strftime('%H:%M:%S', time.localtime())}") + except Exception as error: + raise Exception(error) time.sleep(refreshTime)