2016-04-09 19 views
3

Ich habe den folgenden Code, der gelegentlich aufgrund einer Berechtigungen Fehler abstürzt. Ich versuche es in einer try/except Anweisung einpacken, die den Fahrer zu starten, bis er erfolgreich versucht, halten ...Python versuchen/außer weiter versuchen, bis keine Fehler

def init_driver(): 
    ffprofile = webdriver.FirefoxProfile("my_profile") 
    ffprofile.add_extension(extension="myaddon.xpi") 
    return driver 

driver = init_driver() 

Ich habe Beispiele gesehen mir eine Nachricht drucken lassen, wenn ein Fehler auftritt, aber wie kann ich es bekommen immer wieder versuchen? Hat jemand ein Beispiel, auf das sie mich hinweisen können?

+0

Btw, wo wird 'Treiber' initialisiert? – schwobaseggl

Antwort

2

Hier ist eine Möglichkeit, es zu tun, wenn Sie keine Schleife verwenden möchten. Denken Sie nur an die Funktion auf der Ausnahme

import sys 

def init_driver(tries=0): 

    try: 
     ffprofile = webdriver.FirefoxProfile("my_profile"); 
     ffprofile.add_extension(extension="myaddon.xpi") 
     return driver 

    except Exception: #This should be the exception you expect and not a catch all 
     if tries < sys.getrecursionlimit(): #By default 1,000 can be bumped up by setrecursionlimit 
      return init_driver(tries+1) 
     #just for kicks 
     #else: 
      #sys.setrecursionlimit(sys.getrecursionlimit() + 1) 
      #print("Yes we'll win this game the old-fashioned way, the tried and true way:") 
      #print("We'll cheat!") 
      #refactor/prettify if's to call init_driver if you want to cheat. 
     else: 
      print("OH NO RECURSION LIMIT HIT!!!!!! (ノಠ益ಠ)ノ彡┻━┻") 

driver = init_driver() 
+1

Müssen 'init_driver()' in der Ausnahme-Block zurückgeben – schwobaseggl

+0

Whoops vergaß das! Danke für die Korrektur :) – Pythonista

+0

Lol danke für das Hinzufügen der Rekursionsbegrenzungsbedingungen. –

6

Hier ist eine Schleife, die versucht iteriert:

while True: 
    try: 
     driver = init_driver() 
     break 
    except Foo: 
     continue 

Beachten Sie, dass dies nicht eine nackte except Klausel ist. Bare except s sind gefährlich, weil sie Dinge wie NameError erfassen können, die so selten gefangen werden sollen. Sie sollten die spezifische Ausnahme einfügen, die Sie hier erwarten.

+2

Es ist nicht wirklich wichtig für eine Aussage wie 'break', aber technisch will man nur' init_driver() 'versuchen, und wenn es gelingt, dann" brichst du ". Das ist kanonisch ausgedrückt mit "else: break" nach dem "except" -Block. Wiederum, nicht viel Unterschied für nur "break", aber es auf die "else" verschieben kann klarer (auch gute Praxis für, wenn es etwas komplexer ist als "break"). – TigerhawkT3

2

Hier ist eine rekursive Lösung (mit den Wiederholungen zu verfolgen):

def init_driver(retries=0): 
    try: 
     ffprofile = webdriver.FirefoxProfile("my_profile"); 
     ffprofile.add_extension(extension="myaddon.xpi") 
    except: 
     print('attempt nr. ' + str(retries)) 
     return init_driver(retries+1) 
    return driver 
2

wie folgt tun:

def init_driver(): 
    driver = None 
    ffprofile = webdriver.FirefoxProfile("my_profile"); 
    ffprofile.add_extension(extension="myaddon.xpi") 
    # do something with a valid profile and set driver to something other than None 
    return driver 

driver = None 
while driver is None: 
    driver = init_driver() 
0

nur eine kleine Änderung erforderlich. Wo Foo ist die spezifische Ausnahme, die Sie mit dem Erlaubnisfehler erhalten.

3

Andere Antworten sind in Ordnung, aber sie werden so lange wiederholen, bis die Rekursionstiefe erreicht ist. Ziehen Sie ein Wiederholungslimit in Betracht:

def init_driver(retry_limit=10, nretry=0): 
    if nretry >= retry_limit: 
     return # retry limit reached, maybe raise an exception? 
    try: 
     ffprofile = webdriver.FirefoxProfile("my_profile"); 
     ffprofile.add_extension(extension="myaddon.xpi") 
    except SomeException: 
     return init_driver(nretry=nretry+1) 
    return ffprofile 

driver = init_driver() 
+1

Technisch rekursive Lösungen stoppen die Wiederholung, nachdem sie die von python gesetzte Rekursionstiefe erreicht haben. Standardmäßig ist dies 1.000, daher ist es wahrscheinlich sinnvoll, einen kleineren Grenzwert festzulegen, der nicht auf der maximalen Rekursionstiefe basiert. –