2016-07-15 1 views
1

私は「何のネットワーク」の例外扱いべきではない以下のデコレータがありますこのpythonデコレータには何が問題なのですか?

class NetworkError(RuntimeError): 
    pass 

def reTryer(max_retries=5, timeout=5): 
    def wraper(func): 
     request_exceptions = (
      requests.exceptions.Timeout, 
      requests.exceptions.ConnectionError, 
      requests.exceptions.HTTPError 
     ) 
     def inner(*args, **kwargs): 
      for i in range(max_retries): 
       try: 
        result = func(*args, **kwargs) 
       except request_exceptions: 
        time.sleep(timeout) 
        print("Bad or broken connection, trying again...") 
        continue 
       else: 
        return result 
      else: 
       raise NetworkError 
     return inner 
    return wraper 

をしかし、それがすべてでは動作しませんが、でもない「不良または切断された接続、再試行...」出力はありません私のLANアダプターは切断状態ですが、何も表示されません。これはfuncの定義と呼び出しです:

@reTryer(5,5) 
def func(arg): 
    #some code 

func(arg) 

私に何か不足していますか?

+0

を取得し、あなたは 'inner'機能でタプル' request_exceptions'を定義しようとしましたか? – Frodon

+0

@Frodon何が変わるのですか? – glglgl

+0

@Frodon内部関数は外部関数のスコープ内の変数にアクセスできます。 –

答えて

2

あなたの質問に答えるために:実装が正しいようだと

を、私は、問題の原因である可能性がありますいくつかのことを想像することができます。

主に私はデコレーションされた関数が決して戻りません、あなたがフォーカスしていたものとは異なる例外を投げたり、普通に戻ったりすると思います。

あなたは

@reTryer(2, 1.0) 
def always_ok(): 
    print "ok" 

@reTryer(2, 1.0) 
def always_good_error(): 
    print "good error" 
    raise requests.exceptions.Timeout 

@reTryer(2, 1.0) 
def always_bad_error(): 
    print "bad error" 
    raise RuntimeError 

でこれをテストすることができ、私は

>>> always_ok() 
ok 
>>> import time 
>>> always_good_error() 
good error 
Bad or broken connection, trying again... 
good error 
Bad or broken connection, trying again... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 17, in inner 
__main__.NetworkError 
>>> always_bad_error() 
bad error 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 9, in inner 
    File "<stdin>", line 4, in always_bad_error 
RuntimeError 
>>> 
+0

正確には、例外が発生することなく 'return'sだけであることを確かめてください。 –

+0

ありがとうございます。あなたのアドバイスに従ってこの問題をさらに調査します。 –

関連する問題