4

次のコードを取得したので、例外が発生したときに、次のループにジャンプするのではなく、このループをやり直してください。ここでの擬似コードは意図したとおりに機能することに注意してください。

for cl in range(0, 10):
    try:
        some_function(cl)
    except :
        cl -= 1

私のイニシアチブは、何かがうまくいかなくなったら、もう一度やり直すことでした。明らかに、これは実用的なアイデアではありません。forそれで、ループと使用されているという仮定を前提として、range function私が説明した制御をどのように実装するのですか?

ありがとう

4

3 に答える 3

6

機能するまで関数の試行を続けるには、最初のループ内に2番目のループが必要です。

for cl in range(0, 10):
    while True:
        try:
            some_function(cl)
        except Exception:
            continue    # try it again
        else:
            break       # exit inner loop, continue to next c1
于 2012-12-13T23:20:03.187 に答える
4

ループ変数をより細かく制御するには、ループを使用することをお勧めしwhileます。

cl = 0
while cl < 10:
    try:
        some_function(cl)
        cl += 1
    except:
        pass

Pythonでは、passステートメントは「何もしない」プレースホルダーです。例外が発生した場合は、同じcl値が再試行されます。

もちろん、常に例外が発生した場合にループを終了できるメカニズムも追加する必要があります。

于 2012-12-13T23:18:29.613 に答える
2

私はループに対する病的な憎しみを持っているのでwhile True、@ kindallの答えをこのように単純化することをお勧めします。まず、例外をスローするのではなく、失敗時にsome_function()戻るように変更します。False次に、次のループを使用します。

for cl in range(0, 10):
    while not some_function(cl): pass

変更できない(または変更したくない)some_function()場合は、ラッパーを追加できます。

def exceptionless_function(arg):
    try:
        some_function(arg)
        return True
    except <known exceptions>:
        return False

編集:<known exceptions>修飾されていないexcept句を避ける必要があることを示すために上記を追加しました。実際にキャッチする予定の例外のタイプがわからない場合は、関数を再度呼び出すだけで、特定の場合にほぼ間違いなく間違った動作になります。たとえば、OPは、この関数の再試行中にタイムアウトが発生した場合に「アラート」が発生することを(コメントで)述べています。そのアラートが何らかの例外の形をとる場合、「キャッチオール」の場合は単に無視されます。

于 2012-12-13T23:28:00.393 に答える