1

次のように、フェイルオーバーをどのように行うことができるかについて質問したいと思います。

 again = 1
 start = 1
 try:
   def countthis():
          for i in range (start,200):
              again = i
              print i
 except:
    print "Failure occured, I will try again" 
    start = again
    countthis.run()

for関数がiの試行で失敗した場合、最新のiから(1からではなく)再起動したい

4

2 に答える 2

2

次のようなイテレータ関数を使用できます。

def countthis(start=0, end=100):
    for i in range(start, end):
        print i
        if i == 5:
            raise Exception('5 failed')
        yield i

エラーが発生した場合は、次の番号を使用してカウンターを再開し、失敗した番号をスキップします。

ret = 0
end = 100
while ret < end - 1:
    try:
        for i in countthis(start=ret, end=end):
            ret = i
    except Exception, ex:
        print ex
        # when 5 reached, an exception will be raised, so here we restart at '6'
        ret = ret + 2

これは最終的に印刷されます:

0
1
2
3
4
5
5 failed
6
7
......
99
于 2012-07-22T07:50:03.310 に答える
0

前にコメントしたように、おそらく呼び出しを定義ではなく、try..except でラップする必要があります。これはあなたが探しているものですか?

def f():
    print "f called: ",

    import random
    x = random.randint(0, 10) / 8

    print "1/x =", 1/x

while True:
    try:
        f()
        break
    except ZeroDivisionError:
        print "f failed"
        continue

または、関数全体を 1 から再起動したくない場合は、関数定義内で try..except を使用しないでください。

def f():
    import random

    for i in range(1, 10):
        while True:
            try:
                print i,

                # do something with i:
                print 1 / (i // random.randint(0, 8))
                break
            except ZeroDivisionError:
                continue


f()
于 2012-07-22T06:49:11.157 に答える