Generatoren und Exceptions

15/09/2008 - 00:22 von Alexander Blinne | Report spam
Hallo!

Ich habe gerade ein kleines Problemchen mit Generatoren in Verbindung
mit Exceptions. Ich habe zwei Beispiele mit der (imho) gleichen
Struktur, eins funktioniert, das andere nicht.

Beispiel 1:
fun() misst irgendetwas
generator(10) soll 10 mal messen oder vorher aufhören wenn strg+c
gedrückt wird. Das funktioniert prima mit folgendem code:

import time
import random

def fun():
time.sleep(1)
i = random.randint(0,5)
return i

def generator(n):
while n > 0:
try:
r = fun()
n -= 1
yield r
except KeyboardInterrupt:
n = 0

for i in generator(10):
print i
Der KeyboardInterrupt wird aufgefangen und das Programm endet normal.


Beispiel 2:
Gleiches Muster, diesmal mit Sockets:
recv_response() soll ein Paket empfangen. hierbei kann nicht nur ein
KeyboardInterrupt sondern auch ein timeout auftreten.
recv_forever() soll bis zum Interrupt pakete empfangen.
Der Code in diesem Fall:

-
import socket

sock = socket.socket(socket.AF_INET,socket.SOCK_RAW,
socket.getprotobyname('icmp'))
sock.connect(('localhost',0))
sock.settimeout(1)

def recv_response():
buf = sock.recv(65536)
return (len(buf))

def recv_forever():
recv = True
while recv:
try:
res = recv_response()
yield res
except KeyboardInterrupt: #doesn't work *argh*
recv = False
except socket.timeout:
print 'timeout'

for res in recv_forever():
print res
-

In diesem Fall wird der Interrupt nicht aufgefangen und ich erhalte ein
Traceback:

C:\Dokumente und Einstellungen\Alex\Eigene Dateien\Python\ping>python
ping3_skel2.py
timeout
timeout
Traceback (most recent call last):
File "ping3_skel2.py", line 24, in <module>
for res in recv_forever():
File "ping3_skel2.py", line 16, in recv_forever
res = recv_response()
KeyboardInterrupt


Mein Problem ist jetzt, dass ich nicht sehe wo sich beide unterscheiden
und warum es bei einem geht und beim anderen nicht. Der Interrupt tritt
ja im ersteren Fall in der Regel wàhrend des Sleeps und im zweiten in
der Regel wàhrend des sock.recv auf, also innerhalb der funktion die im
Try: block aufgerufen wird.
Jemand Ideen hierzu? Vielen Dank im vorraus.

Es handelt sich um Python 2.5.2 auf Windows XP SP3 32bit.

Grüße
Alexander
 

Lesen sie die antworten

#1 Thomas Guettler
15/09/2008 - 11:07 | Warnen spam
Alexander Blinne schrieb:
Hallo!

Ich habe gerade ein kleines Problemchen mit Generatoren in Verbindung
mit Exceptions. Ich habe zwei Beispiele mit der (imho) gleichen
Struktur, eins funktioniert, das andere nicht.

Beispiel 1:
fun() misst irgendetwas
generator(10) soll 10 mal messen oder vorher aufhören wenn strg+c
gedrückt wird. Das funktioniert prima mit folgendem code:

import time
import random

def fun():
time.sleep(1)
i = random.randint(0,5)
return i

def generator(n):
while n > 0:
try:
r = fun()
n -= 1
yield r
except KeyboardInterrupt:
n = 0

for i in generator(10):
print i



Hallo,

kann sein, dass der Code bei deinem Test funktioniert. Aber bedenke folgendes:
Der Interpreter ist auch kurz beim Test n>0 (Zeile mit "while"). In dieser Millisekunde wird KeyboardInterrupt
nicht per except aufgefangen.

Gruß,
Thomas

Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de

Ähnliche fragen