Nobuddy hat geschrieben:
Es ist weder Schlamperei, Absicht oder Unvermögen, daß ich das mit `except` noch nicht umgesetzt habe. Ich habe diesen Punkt nicht vergessen und werde es auch noch nachholen.
Dann solltest Du solche Sachen aber aus Höflichkeit erwähnen, denn ansonsten wundert man sich, *wieso* Dinge, die man Dir erklärt hat, *wieder* nicht umgesetzt sind. Ich kann dann nicht wissen, ob Du das überlesen oder nicht verstanden hast. Ersteres wäre "Schlamperei", bei letzterem wäre es *die* Chance, das weiter zu verfolgen, um es dann endlich mal zu verstehen!
Ich kapiere ehrlich gesagt nicht, wieso Du hier nicht die Exception hinschreiben kannst:
Code: Alles auswählen
try:
from bestellorder_lieferant import auftragkontrolle
auftragkontrolle()
except HIER_DIE_EXCEPTION_HINSCHREIBEN:
info = 'Es gab einen Fehler, das Programm für %s konnte nicht gestartet werden!' % title
Was gibt es daran zu "kapieren"? Wenn Du gar nicht weißt, *welche* Exception hier auftreten kann, dann solltest Du das gesamte `try...except` einfach löschen

(Und wenn dann eine Exception auftritt, siehst Du ja, welche es war!)
Ich versuche das mal zu verdeutlichen.
Nehmen wir an, ich habe ein kleines Programm, welches sich bereits vorhandene Daten aus einer Datei einlesen soll; ich verwende hier JSON. Das könnte ich so umsetzen:
Code: Alles auswählen
In [3]: import json
In [4]: def load(filename):
...: with open(filename) as f:
...: return json.load(f)
...:
Wenn ich das nun mal aufrufe, passiert dieses:
Code: Alles auswählen
In [6]: load("data.json")
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
/home/nelson/<ipython-input-6-c90ff8e6ed4c> in <module>()
----> 1 load("data.json")
/home/nelson/<ipython-input-4-9a07b178c4f3> in load(filename)
1 def load(filename):
----> 2 with open(filename) as f:
3 return json.load(f)
4
IOError: [Errno 2] No such file or directory: 'data.json'
Aha. Logisch, eine solche Datei gibt es ja noch gar nicht, wenn ich noch keine "Datenbank" angelegt habe. Wie kann ich damit umgehen? Ich kann einfach diesen Fehler abfangen (= behandeln) und im Falle dieses Problems einfach eine *leere* Datenstruktur zurück geben. Ich entscheide mich für ein leeres Dictionary, da ich diesen Typen als Rückgabewert erwarte.
Code: Alles auswählen
def load(filename):
try:
with open(filename) as f:
return json.load(f)
# Hier fange ich *nur* und ausschließlich diese *eine* Exception ab!
except IOError:
# Meine "Behandlung" besteht darin, dem Aufrufer einfach eine leere,
# aber von ihm erwartete Datenstruktur zurück zu gebe.
return dict()
Schaun mer mal:
Code: Alles auswählen
In [8]: data = load("data.json")
In [9]: data
Out[9]: {}
Aha! Wunderbar, genau das wollte ich doch haben. Die Exception trat auf und ich kann dennoch weiter machen in meinem Programm und bspw. die ersten Datensätze anlegen.
Ich fange nur genau *den* Fehler(typen) ab, der mir oben aufgefallen ist! Dieses ist essenziell wichtig: Ich kann als Entwickler nur auf solche Fehler reagieren, die mir *bekannt* sind! Evtl. gibt es in `json.load` auch noch Passagen, die eine Exception werfen - aber auf diesen Fall kann ich ja noch nicht reagieren! (Im übrigen gibt es die; ich kann in der Doku nachlesen, dass es da zu `ValueError`, `OverflowError` oder auch `TypeError` kommen kann)
Diese Fehler aus dem JSON-Parser sollte ich nicht so behandeln! Denn dann ist ja die bereits vorhandene Datenbank "defekt". Ließe ich das einfach genau so, so würde sich der Benutzer wundern, wieso seine DB "leer" ist! Sinnvoller wäre es in diesem Falle, dem Benutzer mitzuteilen, dass seine JSON-Datei defekt ist und die Stelle zu nennen, so dass er dieses manuell fixen kann.
Ich muss mir immer überlegen, wie ich im Fehlerfalle reagieren will!
Nun überlege Dir mal, was passiert, wenn man *alle* Fehler pauschal abfängt - und genau das machst Du im Moment, wenn Du keinen Typen angibst.
Du "siehst" dann ja nicht, welcher potenziell andere Fehler, als der von Dir erwartete, aufgetreten ist. Insofern behandelst Du dann ggf. Fehler falsch. Das kann im weiteren Verlauf zu Problemen in Deinem Programm führen oder aber zu Debugging-Schwierigkeiten.
Also: *Immer* den Typen angeben, den Du behandeln willst. (Man kann auch mehrere Typen in einem `except`-Ast angeben; lies Dir dazu mal die Doku oder das offizielle Tutorial in dem Abschnitt durch)
Nobuddy hat geschrieben:
Das mit der '__init__' Methode habe ich versucht umzusetzen, bin da aber noch nicht weiter gekommen, so daß ich vorerst ohne dies umgesezt
Hu? Ich habe die doch *exakt* so hingeschrieben, dass es laufen sollte!? Was gibt es da noch für "Probleme", so dass Du dieses einfach weggelassen hast?
Und auf die Problematik mit den globalen "Konstanten" und die Nachfrage bezüglich der "OK" und "CANCEL"-Buttons bist Du auch nicht eingegangen! (s.o. mein erster Absatz über "Höflichkeit"

)