Skriptfehler generell abfangen und behandeln ...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
drnicolas
User
Beiträge: 84
Registriert: Sonntag 24. Juli 2016, 10:32

Momentan fange ich eine ganze Reihe von Fehlern in meinem Skript jeweils ab, indem ich die Anweisung mit Try: kapsele. Es wird dann jeweils der Inhalt einer Log-Datei per Mail verschickt. Die Meldungen werden mit log.debug oder log.info erfasst
Die Fehler betreffen dadurch natürlich immer konkret eine spezielle Anweisung

Ist es auch möglich generelle Fehler, z.B. sogar Syntax-Fehler abzufangen und den Fehlertext ebenfalls in eine Logdatei zu leiten und dann zu mailen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@drnicolas: generell kann man alle Fehler abfangen, bis auf SyntaxFehler, denn die Entstehen schon beim Compilieren, so dass gar kein Code ausgeführt wird.
drnicolas
User
Beiträge: 84
Registriert: Sonntag 24. Juli 2016, 10:32

Oaky. Dann macht das nur Sinn in jedem Fall die Log-Datei per Mail zu schicken
Benutzeravatar
DeaD_EyE
User
Beiträge: 1017
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Die Fehler könnte man abfangen. Man muss halt wissen, dass beim Import eines Moduls der komplette Code einmal durch den Parser läuft und in ByteCode übersetzt wird und danach wird er sogar ausgeführt. Beim Import könnte man den Fehler abfangen:

Code: Alles auswählen

try:
    import foo
except SyntaxError:
    print('Module Foo has a syntax error')
Wenn man sich solche Konstrukte in sein Programm einbaut, macht man aber was gewaltig falsch.
Will man sein Programm testen, sollte man unittest oder vergleichbares einsetzen. Das hat noch den Vorteil,
dass man nicht nur syntaktische Fehler sofort präsentiert bekommt, vielmehr testet man Funktionen seines Codes
auf Richtigkeit.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Die Fehler könnte man abfangen.
Nee - auch bei diesem Ansatz hast du mindestens ein Python-Skript, was Syntaxfehler enthalten könnten, aber in keinem try...except Block stehen kann :-)

Gruß, noisefloor
Benutzeravatar
pixewakb
User
Beiträge: 1411
Registriert: Sonntag 24. April 2011, 19:43

drnicolas hat geschrieben:Momentan fange ich eine ganze Reihe von Fehlern in meinem Skript jeweils ab, indem ich die Anweisung mit Try: kapsele. Es wird dann jeweils der Inhalt einer Log-Datei per Mail verschickt. Die Meldungen werden mit log.debug oder log.info erfasst
Irgendwie erscheint mir das sehr falsch.

Erstens gibt es 5 Stufen und bei einem Fehler würde ich auch eine Fehlermeldung (logging.error()) und hier speziell mittels logging.exception() absetzen. Wenn Du später mal die Stufe, ab der Meldungen abgesetzt werden, hochschraubst, bekommst Du von den Fehlern nichts mehr mit. Bei einem Fehler möchte ich schon gerne sehen, woran es gescheitert ist.

Logger.exception(msg, *args, **kwargs)
Logs a message with level ERROR on this logger. The arguments are interpreted as for debug(). Exception info is added to the logging message. This method should only be called from an exception handler.

Code: Alles auswählen

>>> import logging
>>> try:
	1 / 0
except ZeroDivisionError:
	logging.exception("War was falsch...")

	
ERROR:root:War was falsch...
Traceback (most recent call last):
  File "<pyshell#5>", line 2, in <module>
ZeroDivisionError: division by zero
Das ist der zweite Punkt: Eigentlich sollten Fehler nicht gekapselt werden, sondern im Idealfall aus dem Programmtext ausgemerzt werden. Dass ich Fehler behandeln muss, kommt eher selten vor, aber eigentlich immer, wenn ich fremde Daten behandele, die halt auch mal kaputt sein können.
drnicolas
User
Beiträge: 84
Registriert: Sonntag 24. Juli 2016, 10:32

Das letztere werde ich mal ausprobieren.

Vielen Dank für die zahlreichen Beiträge
Antworten