Um jeden Preis eine Fehlermeldung in der Konsole vermeiden!

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
PewDiePy
User
Beiträge: 5
Registriert: Freitag 9. Oktober 2015, 19:04

In PHP gibt es etwas ganz tolles: @. Setzt man ein @ vor einer Funktion wirft diese in keinem Fall ein Fehler, sondern macht einfach weiter sollte es nicht geklappt haben. Das vermisse ich.

Hiermit möchte ich ein Programm schließen, falls es geöffnet ist, weil es sonst zu Problemen kommt. Das klappt auch. Wenn er diesen Prozess nicht findet, dann teilt er mir das auch mit und macht weiter. Aber die Konsolennachrichten nerven, besonders wenn man eine grafische Oberfläche hat.

Code: Alles auswählen

os.system('TASKKILL /F /IM program.exe')
Ich hab mal gelesen, wenn man die Datei als .pyw speichert wird die Konsole bei der Ausführung nicht mehr geöffnet, was auch eine Lösung wäre, funktioniert bei mir nur leider nicht.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@ PewDiePy: man will nicht, dass egal welcher Fehler einfach ignoriert wird, wenn, dann will man selektiv die Fehler ignorieren, die nachprüfbar für die weitere Ausführung nicht relevant sind. In diesem Fall leitet man die Ausgabe einfach um:

Code: Alles auswählen

out, err =subprocess.Popen(['TASKKILL', '/F', '/IM', programm], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
Danach kannst Du out oder err prüfen, ob die erwartete Ausgabe kommt, oder irgendein unbekannter Fehler, den Du am besten auch anzeigst.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Der Fragesteller sucht m. E. ganz einfach die try: - except: - Anweisung.

Code: Alles auswählen

a = 1
b = 0

try:

    a = a / b

except KeyError:

    print("Das ist ein KeyError, z. B. dictionaries")

except ZeroDivisionError:

    print("Division durch 0!")

    a = 2


finally:

    print("Finally")

try:

    b = b + c

except ZeroDivisionError:

    print("Division durch 0!")

except NameError:

    print("name 'c' is not defined")
    

print("a enthält jetzt den Wert {}".format(a))
print("b enthält jetzt den Wert {}".format(b))
print("Ende der Vorführung.")
Es gibt eine Seite in der Dokumentation mit allen definierten Fehlern. Ein except-Block ohne spezifischer Fehler geht auch, ist aber nicht empfehlenswert, weil dir so Fehler durchrauschen können. M. E. solltest Du im konkreten Fall loggen, weil sonst auch zu viel durchrauscht und du nicht weißt, was konkret den Fehler ausgelöst hat usw.
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

PS experimentiere mal was mit dem Quellcode und nimm mal manche Zeilen raus. Die ZeroDivision-Sache habe ich nur zur Illustration beigegeben, im zweiten Fall wird sie so z. B. nicht angesteuert.

BTW: Ich habe gerade in der Konsole so Sachen wie a = 2 / 0 eingegeben, Enter gedrückt und dann den Fehlernamen rüberkopiert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, es geht dem OP nicht um Python Fehler, sondern um Ausgaben von 3. Programmen wie sein Code zeigt.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@pixewakb: schönes abschreckendes Beispiel für sinnvolle Fehlerbehandlung. Im ersten try-Block kann kein KeyError auftreten, im zweiten kein ZeroDivisionError. Sollte doch wieder erwarten so ein Fehler auftreten, dann ist er garantiert unerwartet und darf nicht ignoriert werden. NameError abzufangen, macht auch nur an ganz bestimmten Stellen Sinn, hier nicht. Der Code wäre auch ohne die vielen Leerzeilen deutlich besser lesbar.
Antworten