Eine frage zu Exceptions

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
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ein Leerzeichen weniger in der Zeile hätte es auch getan.
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.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Danke für die Tips!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Mich wunderts blos,
weil ich vorher noch nie ein Problem damit gehabt habe, und wiso ist das leer bei der
eingabe 00:00? :?: :?: :?:
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jtschoch hat geschrieben:[...] und wiso ist das leer bei der eingabe 00:00? :?: :?: :?:
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.
Antworten