Endlosschleife mit KeyInterrupt beenden

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
rossi
User
Beiträge: 1
Registriert: Donnerstag 23. Mai 2013, 13:42

Hallo Leute,
in meinem Programm habe ich eine endlose while-schleife die ich mit try-except Keyinterupt beende möchte. Das sieht in etwa so aus:

while True :
try: ...
....

except KeyboardInterrupt :
break
...

Das Problem dabei ist, dass es machmal klappt(dh der code der danach kommt wird auch ausgeführt),
manchmal sprint er komplet raus
und meistens gibt er ein fehler im Terminal aus der so aussieht:

^CTraceback (most recent call last):
File "/home/at-labor/mystacks/dynamixel_motor/dynamixel_controllers/nodes/dynamixel_moving.py", line 89, in <module>
values = dxl_io.get_feedback(motor_id)
File "/home/at-labor/mystacks/dynamixel_motor/dynamixel_driver/src/dynamixel_driver/dynamixel_io.py", line 846, in get_feedback
response = self.read(servo_id, DXL_GOAL_POSITION_L, 17)
File "/home/at-labor/mystacks/dynamixel_motor/dynamixel_driver/src/dynamixel_driver/dynamixel_io.py", line 138, in read
data = self.__read_response(servo_id)
File "/home/at-labor/mystacks/dynamixel_motor/dynamixel_driver/src/dynamixel_driver/dynamixel_io.py", line 101, in __read_response
raise DroppedPacketError('Invalid response received from motor %d. %s' % (servo_id, e))
dynamixel_driver.dynamixel_io.DroppedPacketError: Invalid response received from motor 1. (4, 'Interrupted system call')


achja, Mein System: Ubuntu 12.04

Vielen Dank in vorraus
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Wenn du in der while schleife eine zeitaufwändige Funktion durchführst und der interpreter diese gerade abarbeitet wird das ctrl+c an diese Funktion geleitet. Die Funktion wirft dann eine Exception die du in deinem try/Except nicht abfängst

€ Muss ja keine zeitaufwendige Funktion sein, aber der Interpreter ist wohl gerade in einer unterfunktion die das try/except nicht abkann.
BlackJack

@rossi: Warum ist das ``try``/``except`` *in* der Schleife und nicht die Schleife im ``try``-Block?

Du musst natürlich dafür sorgen, dass das Programm als Ganzes in einem konsistenten Zustand ist, nach dem die Schleife irgendwo durch den `KeyboardInterrupt` abgebrochen wurde. Falls das überhaupt geht, denn falls diese Ausnahme innerhalb und nicht nach der Schleife ausgelöst wird, dann siehe JonasR's Beitrag. In dem Fall musst Du auch andere Ausnahmen, die durch den `KeyboardError` ausgelöst werden, richtig behandeln.
Antworten