Seite 1 von 1

Abfangen von KeyboardInterrupt

Verfasst: Montag 11. Juli 2011, 14:16
von Newcomer
Also ich hab folgendes Problem:
Ich möchte z.B. bei einem Schleifendurchlauf, der mir zu lange dauert abbrechen. Jetzt bricht das ganze Programm ab und ich möchte ja das Ergebnis meiner bisherigen berechnungen sehen. Ich dachte da an sowas, um zu lösen:

Code: Alles auswählen

try:
    
    for i in range (10000000): # nur beispiel
        pass
except:
    
    print(i)
    raise KeyboardInterrupt



Ja das ist nicht sehr schön aber es funktioniert. Wäre es auch anders lösbar??

Edit: Sorry für die verhunzen einrückungen

Re: Abfangen von KeyboardInterrupt

Verfasst: Montag 11. Juli 2011, 14:20
von deets
Na, das mindeste waere ja eben auch nur den KeyboardInterrupt abzufangen, damit andere Exceptions die einen Fehler im Programm anzeigen auch vernuenftig behandelt werden.

Und dann waere es unter Umstaenden ueberlegenswert, ob du dein Programm nicht in Form von generatoren/greenlets oder aehnlichem implementierst. Das haette den Vorteil, dass du die Arbeit in viele kleine Schritte unterteilst, und dazwischen drin abbrechen kannst - aber kontrolliert, und nicht irgendwo mitten in einer Teilaufgabe, die vielleicht schon zur Haelfte fertig ist.

Re: Abfangen von KeyboardInterrupt

Verfasst: Montag 11. Juli 2011, 14:24
von cofi
Newcomer hat geschrieben:Edit: Sorry für die verhunzen einrückungen
Dann beheb das doch.

Wenn du nur den `KeyboardInterrupt` abfangen willst, solltest du auch nur den abfangen. Bei einem `NameError` einen `KeyboardInterrupt` auszuloesen und alle Informationen wegzuwerfen ist reichlich unbrauchbar.
Statt dem expliziten `raise KeyboardInterrupt` kannst du auch ein `raise` nutzen um die eigentliche Exception weiterzugeben.

Re: Abfangen von KeyboardInterrupt

Verfasst: Montag 11. Juli 2011, 14:37
von Newcomer
Ok danke

Re: Abfangen von KeyboardInterrupt

Verfasst: Montag 11. Juli 2011, 14:39
von Newcomer
Ja und wenn ich nicht jedesmal das ergebnis angezeigt haben möchte und dann erst das Endergebnis haben möchte, das vll. nur teilweise fertig ist??

Re: Abfangen von KeyboardInterrupt

Verfasst: Montag 11. Juli 2011, 15:10
von cofi
Was ist das "Ergebnis" und was das "Endergebnis"?
Bitte nehm dir die Zeit deine Posts verstaendlich zu schreiben und lies sie vor dem Posten am besten nochmal durch.

Generell gilt, wenn du eine Berechnung per Exception abbrichst, kannst du sie nicht nur unterbrechen und fortsetzen. Das laesst Pythons Exception-Semantik nicht zu, in Common Lisp waere es mit Restarts moeglich.