2017-02-07 17 views
1

再試行モジュールを使用して例外が発生するたびに関数を再試行しようとしています。ただし、例外があっても再試行することはありません。たとえば、以下のコードスニペットを見てください。 2回目のURLのランダムな間隔でurl_listに10回再試行して失敗する必要があります。誰でも再試行していない理由を教えてもらえますか?Pythonの再試行モジュールが例外時に再試行しない

import urllib2 
from retrying import retry 


def retry_if_exception(exception): 
    """Return True if we should retry (in this case when it's any Exception), False otherwise""" 
    return isinstance(exception, Exception) 


@retry(retry_on_exception=retry_if_exception, wait_random_min=1000, wait_random_max=1500, stop_max_attempt_number=10) 
def start_http_request(url): 
    try: 
     response = urllib2.urlopen(url) 
     print response 
    except Exception as err: 
     retry_if_exception(err) 
     print (err.reason) 

url_list = ['https://www.google.ca', 'http://goo123213.ca', 'http://code.activestate.com'] 

for url in url_list: 
    print url 
    start_http_request(url) 

参照:

https://pypi.python.org/pypi/retrying

答えて

1

retryingためのドキュメントによれば、retry_on_exceptionは、それが再試行するかどうTrueを返す関数であると考えられます。代わりに、タイプを供給しています。試してみてください:

@retry(retry_on_exception=lambda e: True, wait_random_min=1000, wait_random_max=1500, stop_max_attempt_number=10) 

...それぞれの失敗時に再試行する必要があります。

0

あなたはドキュメントを確認する必要があり、あなたは右のそれをやっていない:

retry_on_exceptionはただ、それが再試行する必要があるかどうかを判断するために呼び出されます...あなたがどんな例外でそれをしたい場合は機能を期待しますそれを残して:

@retry(wait_random_min=1000, wait_random_max=1500, stop_max_attempt_number=10) 

を使用すると、特定の条件を指定したい場合は、次の

@retry(retry_on_exception=retry_if_exception,wait_random_min=1000, wait_random_max=1500, stop_max_attempt_number=10) 

def retry_if_exception(exception): 
    """Return True if we should retry (in this case when it's any Exception), False otherwise""" 
    return isinstance(exception, Exception) 
+0

あなたは私の悪い、正しいです。しかし、私はまだ再試行していない上記のコードを変更しました。 – Rihan

+0

@Rihanすべての例外を再試行する場合は、例外タイプを指定する必要はありません。私の更新された答えを参照 – TemporalWolf

+0

マジック、あなたはスポットです。また、問題の根本原因は、再試行ブロック内で手動で例外をキャッチしようとしていて、それを削除して問題を解決したということです。 – Rihan

関連する問題