2012-02-10 1 views
2

私はしばしば例外をスローする機能を持っています(3g以上のSSH)。例外処理 - ネストまたはループによって関数を再度実行しますか?

私は、成功するまでfunction()を10秒ごとに実行しようとしています(例外は発生しません)。

私はそれを見るように、2つのオプションがあります:

ネスティング:

def nestwrapper(): 
    try: 
     output = function() 
    except SSHException as e: 
     # Try again 
     sleep(10) 
     return nestwrapper() 
    return output 

ルーピング:(更新)

は、前のループのコードがあったと指摘されていますかなり不要です。

def loopwrapper(): 
    while True: 
     try: 
      return function() 
     except SSHException as e: 
      sleep(10) 

これを行うための好ましい方法はありますか?

ネスティングと例外スタックに問題はありますか?

答えて

3

ここでは、よりクリーンで効率的なループが見つかります。これが自動化ジョブの場合、再帰的メソッドはPython再帰制限を打つことができます(デフォルトは1000 iirc、sys.getrecursionlimit()でチェックできます)。

ID照合であるため、式にstatus is Falseを使用しないでください。 while not statusを使用してください。

私はここで2つの異なる機能の必要性を見ていないので、私はおそらく、あまりにも若干異なり、それを実装します:

def function_with_retries(): 
    while True: 
    try: 
     output = function() 
    except SSHException: 
     sleep(10) 
    else: 
     return output 
+0

'sys.getrecursionlimit()'に関する情報をありがとう! –

0

はそれをシンプルに保ちます。

function looper(f): 
    while 1: 
     try: 
      return f() 
     except SSHException, e: 
      sleep(10) 

output = looper(<function to call>) 
+0

例外インスタンスへのハンドルを取得する好ましい方法は、 'except'を' except'として 'as'キーワードを使用することです。これは、タプル内の複数の例外の型をチェックするための構文の混乱を避けるためだと思います。 – wim

+0

@wim私は同意しています。「as」はもっとPythonicです、私は元の質問から切り取って貼り付けました。 – ironchefpython

+0

@wimあなたは[PEP 3110](http://www.python.org/dev/peps/pep-3110/)(2.6以降)の時点で正しいです。乾杯! –

1

私は、特別に関数呼び出しを2回ラップするのは大変意味がありません。例外はおそらく妥当であり、その特定の例外について再試行する余分なステップに進んでいます。私が言っていることは、try/exceptがかなりリトライしているループに密接に関わっているということです。

これは私が正常にこれを行う方法です:あなたが実際にsomething()に管理まで、むしろ

def retry_something(): 
    while True: 
     try: 
      return something() 
     except SomeSpecialError: 
      sleep(10) 

while True:は、あなたが次第だまさに本当にあなたは永遠にループするつもりかそれから戻ってくる。これ以上の成功のブール値フラグは必要ありません。これはreturn文の通常の場合(これは丁寧にループを抜け出します)で示されます。