Seite 1 von 1
Eine frage zu Exceptions
Verfasst: Samstag 3. Dezember 2011, 11:00
von jtschoch
Hi,
ich habe ein Problem ich habe in mein script einen Error,
aber ich habe eine Exception (try...except),
Aber ich habe keine lust die wieder auszukommendieren und alles vorzurücken.
Das Problem ist ich weis ja nicht den Fehlertyp!
Gibt es noch eine Möglichkeit den Error auszugeben?
Und der Fehler kommt von hier:
Code: Alles auswählen
if system == "linux2":
if int(minute) > 4:
#time.sleep
subprocess.Popen("notify-send -i /home/%s/Bilder/icons/url2.gif 'Noch 5 Minuten' %s" % user , shell = True)
^
Habe ihn gerade endekt
Aber es wäre trotzdem schön wnn ihr Antwortet,
villeicht brauche ich das ach ein anders mal!
Re: Eine frage zu Exceptions
Verfasst: Samstag 3. Dezember 2011, 11:07
von Dav1d
Das Traceback-modul (
http://docs.python.org/library/tracebac ... -traceback) oder:
Code: Alles auswählen
try:
…
except Exception, e:
print e.__class__.__name__
z.B.:
Code: Alles auswählen
In [1]: try:
...: 1/0
...: except Exception, e:
...: print e.__class__.__name__
...:
ZeroDivisionError
Re: Eine frage zu Exceptions
Verfasst: Samstag 3. Dezember 2011, 11:23
von jtschoch
Danke, aber ich habe hier noch einen
genialen error: IndentationError: unexpected indent übersetzt IndentationError: unerwartete Gedankenstrich
wie bekomme ich den weg?
Code: Alles auswählen
if int(minute) > 4:
time.sleep(300)
restzeit -= 300
if sys.platform == "linux2":
subprocess.Popen("notify-send -i /home/%s/Bilder/icons/url2.gif 'Noch 5 Minuten'" % user , shell = True)
else: #Für Windows
subprocess.Popen("msg Noch 5 Minuten" % user , shell = True)
if int(minute) > 9:
time.sleep(600)
restzeit -= 600
if system == "linux2":
subprocess.Popen("notify-send -i /home/%s/Bilder/icons/url2.gif 'Noch 10 Minuten'" % user , shell = True)
else: #Für Windows
subprocess.Popen("msg Noch 10 Minuten" % user , shell = True)
Code: Alles auswählen
File "TimeLimiter.py", line 141
if sys.platform == "linux2":
^
IndentationError: unexpected indent
War Falsch eingerückt muss mal bei gedit die schriftart ändern
Re: Eine frage zu Exceptions
Verfasst: Samstag 3. Dezember 2011, 11:25
von webspider
Ein Leerzeichen weniger in der Zeile hätte es auch getan.
Re: Eine frage zu Exceptions
Verfasst: Samstag 3. Dezember 2011, 12:41
von BlackJack
@jtschoch: Keine Lust alles wieder vor zurücken klingt danach als wenn Du Deine Werkzeuge nicht nicht so gut beherrschst. Jeder Editor der sich zum Programmieren eignet, bietet die Möglichkeit alle markierten Zeilen auf einmal eine Ebene ein- oder auch wieder auszurücken. Bei vielen geht das über die Tab-Taste für das Einrücken und mit Umschalttaste + Tab-Taste für die Gegenrichtung.
Das Problem ist doch wohl aber schon wieder ein ``except`` ohne eine konkrete Ausnahme gewesen!? Lass das doch bitte endlich mal sein. Wenn Du nicht weisst was da kommen kann, dann kannst Du es in aller Regel auch nicht sinnvoll behandeln. Wenn Du es schon so weit hast wie Dav1d es beschrieben hat, reicht auch ein ``print e``, denn die Zeichenkettenrepresentation einer Ausnahme enthält normalerweise auch ihren Namen. Und in vielen Fällen auch noch zusätzliche Informationen über den Grund.
In dem Quelltextteil sind auch wieder viele unschöne Wiederholungen von Quelltextstruktur und Daten enthalten. Die beiden ``if``-Zweige unterscheiden sich nur geringfügig durch Werte die alle von `minute` abhängen. Die Nachrichtentexte enthalten zudem für Linux und Windows einen gemeinsamen Text, den man auch nicht immer wieder neu schreiben oder kopieren sollte.
Ständig an mehreren Stellen im Programm `sys.platform` abzufragen ist auch nicht elegant, denn der Wert ändert sich während der Laufzeit des Programms nicht. Das sollte man *einmal* am Programmanfang abfragen und dann eine von mehreren plattformspezifischen Benachrichtigungsfunktionen zum Beispiel an den Namen `notify` binden. Dann kann man die Funktion überall im Programm zum Beispiel mit ``notify('Eine Nachricht.')`` aufrufen. Wenn das System nicht 'linux2' ist, dann ist es nicht automatisch Windows. Man sollte da auch eine Rückfalllösung für gar keine Nachrichten haben.
Bei `Popen` sollte man nach Möglichkeit auf ``shell=True`` verzichten und den Programmnamen und die Argumente als Liste übergeben. Dann braucht man sich keine Gedanken über das schützen der Argumente für die, beziehungsweise vor der Shell machen.
Ich sehe da übrigens einen ``TypeError: not all arguments converted during string formatting`` auf Dich zu kommen. Der wegen des Kopierens von Quelltext dann auch gleich zweimal vorhanden ist.
Re: Eine frage zu Exceptions
Verfasst: Samstag 3. Dezember 2011, 22:46
von jtschoch
Danke für die Tips!
Re: Eine frage zu Exceptions
Verfasst: Sonntag 4. Dezember 2011, 00:08
von jtschoch
Nächten Fehler:
Code: Alles auswählen
TypeError: instance exception may not have a separate value
Genauerer error:;
Code: Alles auswählen
Traceback (most recent call last):
File "TimeLimiter.py", line 246, in <module>
main()
File "TimeLimiter.py", line 138, in main
pzeit = int(gesammtzeit[3:6])
ValueError: invalid literal for int() with base 10: ''
ich mache mal das ganze Script rein:
http://www.python-forum.de/pastebin.php?mode=view&s=255
Ich habe es schon überarbeitet,
könnte noch stellen geben wo ich was übersehen habe,
bin ja auch noch nicht fertig!
Re: Eine frage zu Exceptions
Verfasst: Sonntag 4. Dezember 2011, 00:22
von webspider
Wieso das ganze so umständlich? Das Programm könnte doch mit time.sleep(60) immer wieder eine Minute ein Nickerchen machen, ggf. eine Statusmeldung ausgeben und wenn oft genug geschlafen wurde per os.system("shutdown -s -f") oder os.system("shutdown -h now") herunterfahren.
Oder hab ich da etwas übersehen was die Umständlichkeit rechtfertigt?
Re: Eine frage zu Exceptions
Verfasst: Sonntag 4. Dezember 2011, 00:30
von /me
jtschoch hat geschrieben:Code: Alles auswählen
Traceback (most recent call last):
File "TimeLimiter.py", line 246, in <module>
main()
File "TimeLimiter.py", line 138, in main
pzeit = int(gesammtzeit[3:6])
ValueError: invalid literal for int() with base 10: ''
Was möchtest du denn jetzt noch wissen? Der Fehler steht doch da klar und deutlich. Du versuchst einen Leerstring mit int() zu einer Zahl zu casten und das geht natürlich nicht. Der Fehler tritt in Zeile 138 auf und der String den du übergibst ist
gesammtzeit[3:6]. Daraus kann man nun ja wohl eindeutig schließen, dass der String
gesammtzeit maximal drei Zeichen besitzt.
Es macht wirklich keinen Spaß mehr dir etwas zu erklären, weil du nach meinem Gefühl kreuz und quer in der Gegend herumprogrammierst ohne wirklich zu verstehen was du tust. Schlimmer noch, du bist entweder nicht gewillt oder nicht in der Lage dir elementare Dinge selber anzueignen. Beides sind keine guten Voraussetzungen für einen Softwareentwickler.
Re: Eine frage zu Exceptions
Verfasst: Sonntag 4. Dezember 2011, 11:17
von jtschoch
Mich wunderts blos,
weil ich vorher noch nie ein Problem damit gehabt habe, und wiso ist das leer bei der
eingabe 00:00?

Re: Eine frage zu Exceptions
Verfasst: Sonntag 4. Dezember 2011, 12:30
von /me
Wenn du keine Entwicklungsumgebung mit integriertem Debugger einsetzt, dann kannst du immer noch die klassische Variante verwenden. Lass dir vor der kritischen Stelle einfach mit print den Wert der Variablen ausgeben.
Der Grund ist übrigens ziemlich eindeutig und das Problem tritt auch nicht nur bei einer Eingabe von 00:00 auf.