Re: [Python-de] Micropython - Exception nachträglich ermitteln

Am 02.07.2018 um 15:10 schrieb Stefan Schwarzer:
On 2018-07-02 13:07, Michael S. wrote:
habe hier einen ESP8266 mit Micropython am Laufen. Der läuft 24h und sendet zyklisch Daten an einen Webserver. Gelegentlich (Tage bis Wochen) passiert es, das das Python-Script vermutlich mit einer Exception abstürzt. Wenn ich dann mit WebREPL draufschaue sehe ich, dass die Konsole funktional ist. Das bedeutet: 1. Es hat kein Reboot stattgefunden, denn dann wäre das Script über den Autostart neu gestartet worden. 2. Das Script wurde vermutlich durch eine Exception beendet.
Die mir bekannten kritischen Dinge (Netzwerk) habe ich schon mit Try/Except abgefangen. Trotzdem bricht das Skript ab.
Wie bekomme ich raus, was das für eine Exception war? Ich kann schlecht wochenlang ein Notebook mit RS232 durchlaufen lassen, um da mitzuhören.
ich habe keine Erfahrung mit MicroPython, aber sonst ist das übliche Vorgehen, auf der obersten Aufrufebene ein try/except zu verwenden und im Fehlerfall die Exception (evtl. mit weiteren Informationen) zu loggen.
Also in etwa:
import logging
def main(): ...
if __name__ == "__main__": # Set up logging. log = logging.getLogger() ... try: main() except Exception: log.exception("ggf. zusätzlicher Text") logging.shutdown()
"Netzwerkfehler" lassen sich manchmal schwer abfangen, weil sie in ganz verschiedenen Exceptions resultieren können (bspw. Low-Level-Socketfehler oder Fehler auf Anwendungsprotokoll- Ebene). In dem Fall ist es für die Fehleranalyse hilfreich, wie oben lieber zu viel als zu wenig abzufangen und zu loggen.
Eigentlich mache ich das und habe um die Netzwerk-Sache ein Try/Except außenrum gesetzt. Es ist halt kein Linux dahinter. z.B. könnte auch RAM-Mangel der Grund sein und dann kann auch ein Versuch, ne Datei zu schreiben, schief gehen. Da ich nach der Exception ja auf der Console bin und da arbeiten kann: Kann ich die letzte Exception nochmal abfragen? Merkt sich das ein normales Python? -- Michael
participants (1)
-
Michael S.