2017-10-16 5 views
2

Ich versuche, Pythons Signalmodul zu lernen. Bitte beachten Sie das folgende Beispiel:Signalmodul löst keine Ausnahme aus

def timeoutFn(func, args=(), kwargs={}, timeout_duration=1, default=None): 
    import signal 

    class TimeoutError(Exception): 
     pass 

    def handler(signum, frame): 
     print "Trying to raise exception" 
     raise TimeoutError 

    # set the timeout handler 
    signal.signal(signal.SIGALRM, handler) 
    signal.alarm(timeout_duration) 
    try: 
     result = func(*args, **kwargs) 
    except TimeoutError as exc: 
     result = default 
    finally: 
     signal.alarm(0) 

    return result 

und

import time 

def foo(): 
    for i in range(10): 
     time.sleep(0.5) 
     print "Sleeping" 

Beim Aufruf der Funktion timeoutFn(foo) folgende gedruckt wird, aber es macht die Ausnahme ausgelöst.

Sollte es nicht die Timeouterror erhöhen? Aber alles, was gedruckt wird, ist

Sleeping Trying to raise exception und Programm stoppt.

+0

Es funktioniert korrekt. Was erwartest du? Diese Ausnahme wurde erhoben? – Trilliput

+0

Nach dem Drucken "Versuch, Ausnahme auszulösen", bekomme ich keine TimeoutError – Aditya

Antwort

0

Die Ausnahme wurde nicht ausgelöst, weil Sie es fangen. Achten Sie auf die Zeile:

except TimeoutError as exc: 
    result = default 

Der Block bedeutet, dass, wenn die Ausnahme Timeouterror erhoben worden ist, wird result-default zugeordnet wird (die None in Ihrem Beispiel) und die Skripte weiter anhält, ohne eine Ausnahme darstellt.

Update:

signal.alarm nicht stoppen den Fluss. Die Exception wird also um das Timeout erhöht und wenn das Script zu diesem Zeitpunkt in einem try-Block ist, wird die Exception abgefangen. Sie können besser sehen, wie es funktioniert, wenn Sie timeout_duration auf 3 erhöhen. Dann wird es mehr Zeit geben, mehrere 'Schlaf'-Nachrichten zu drucken. Es zeigt, dass der Interpreter bis zum Auslösen der Ausnahme den try-Block betreten hat.

+0

Diese Zeile fängt die Ausnahme, die in 'try' Block auftritt, nicht die Ausnahme vor Versuch auftreten. – Aditya

+0

'signal.alarm' stoppt den Fluss nicht. Die Ausnahme wird also um das Zeitlimit erhöht und wenn sich das Skript in einem try-Block befindet, wird die Ausnahme abgefangen. Sie können besser sehen, wie es funktioniert, wenn Sie 'timeout_duration' auf 3 erhöhen. Dann wird es mehr Zeit geben, mehrere 'schlaf' Nachrichten zu drucken. – Trilliput

Verwandte Themen