2017-10-16 12 views
2

私はPythonのシグナルモジュールを学びたいと考えています。以下は、印刷されますが、それは例外を発生させない機能timeoutFn(foo)を呼び出すことでシグナルモジュールで例外が発生しない

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 

と、

import time 

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

:以下の例を考えてみてください。

TimeoutErrorを上げてはいけませんか?しかし、それが印刷されるのは

Sleeping Trying to raise exception です。

+0

正しく動作します。あなたは何を期待していますか?その例外は発生しましたか? – Trilliput

+0

"例外を発生させようとしています"というメッセージが表示された後、私はTimeoutErrorを受け取りません – Aditya

答えて

0

あなたがそれを捕まえるため、例外は発生していません。行に注意してください:

except TimeoutError as exc: 
    result = default 

ブロック手段、例外TimeoutErrorが提起されていた場合、resultは(あなたの例ではNoneである)defaultに割り当てられるとスクリプトが例外を示すことなく、さらに続けていること。

更新:

signal.alarmは、流れを停止しません。したがって、タイムアウトによって例外が発生し、tryブロックでその時間までにスクリプトが実行される場合は、例外がキャッチされます。 timeout_durationを3に増やすと、どのように動作するかをよりよく理解できます。複数の「スリープ」メッセージを印刷する時間が増えるほどです。例外が発生する頃には、インタプリタがtryブロックに入ったことを示しています。

+0

この行は、試行前に発生した例外ではなく、 'try'ブロックで発生する例外を捕捉します。 – Aditya

+0

'signal.alarm'はフローを停止しません。したがって、タイムアウトによって例外が発生し、スクリプトがtryブロック内にある場合、例外がキャッチされるよりも優先されます。 'timeout_duration'を3にすると、どのように動作するのか、より良く理解できます。複数の 'スリープ'メッセージを印刷する時間が増えるほどです。 – Trilliput

関連する問題