Heim  >  Artikel  >  Backend-Entwicklung  >  Lösung zum erneuten Versuch, wenn eine Ausnahme auftritt

Lösung zum erneuten Versuch, wenn eine Ausnahme auftritt

Y2J
Y2JOriginal
2017-05-13 14:00:232426Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich die Lösung für abnormale Wiederholungen in Python vor. Ich glaube, dass sie für jeden, der Python benötigt, einen gewissen Referenzwert hat . Werfen wir einen Blick darauf.

Vorwort

Bei der Datenerfassung kommt es häufig vor, dass Programme aufgrund von Netzwerkproblemen gespeichert werden und den Fehlerinhalt nachbearbeiten.

Ursprünglicher Prozess:


def crawl_page(url):
 pass
 
def log_error(url):
 pass
 
url = ""
try:
 crawl_page(url)
except:
 log_error(url)

Verbesserter Prozess:


attempts = 0
success = False
while attempts < 3 and not success:
 try:
  crawl_page(url)
  success = True
 except:
  attempts += 1
  if attempts == 3:
   break

Kürzlich entdeckte neue Lösung: erneut versuchen

Wiederholen ist ein Python. Das Wiederholungspaket kann verwendet werden um einige Programmabschnitte, die möglicherweise fehlschlagen, automatisch erneut zu versuchen. retrying Stellen Sie eine Dekoratorfunktion bereit Die dekorierte Funktion wird erneut ausgeführt, wenn sie fehlschlägt. Standardmäßig wird es so lange wiederholt, wie ein Fehler gemeldet wird. retry


import random
from retrying import retry
 
@retry
def do_something_unreliable():
 if random.randint(0, 10) > 1:
  raise IOError("Broken sauce, everything is hosed!!!111one")
 else:
  return "Awesome sauce!"
 
print do_something_unreliable()
Wenn wir die Funktion

ausführen, wird sie erst beendet, wenn have_a_try 5 zurückgibt, andernfalls wird sie erneut ausgeführt. random.randint

retry kann auch einige Parameter akzeptieren. In der Initialisierungsfunktion der Retrying-Klasse im Quellcode können Sie die optionalen Parameter sehen:

  • s<a href="http://www.php.cn/wiki/904.html" target="_blank">top<p>_max_attempt_number</p></a>: gewohnt Legen Sie das Maximum fest. Die Anzahl der Versuche wird nicht mehr wiederholt, wenn sie diese Zahl überschreitet s<a href="http://www.php.cn/wiki/904.html" target="_blank">top</a>_max_attempt_number
  • : Wenn sie beispielsweise auf 10000 eingestellt ist, beginnt sie ab dem Zeitpunkt, an dem die Dekoration erfolgt Die Ausführung der Funktion beginnt und endet, wenn die Funktion erfolgreich ausgeführt wird. Solange dieser Zeitraum 10 Sekunden überschreitet, wird die Funktion nicht mehr ausgeführt stop_max_delay

    : Legen Sie die Verweildauer zwischen zwei
  • fest. Zeit
  • wait_fixedretrying

    : Erzeugen Sie die Verweildauer zwischen zwei
  • s auf zufällige Weise
  • wait_random_min和wait_random_maxretrying

    : Verwenden Sie einen Index. Das Formular generiert die Verweilzeit zwischen zwei
  • s, und der generierte Wert ist
  • ist die Häufigkeit, mit der

    stattgefunden hat Wenn der generierte Wert die Größe von wait_exponential_multiplier和wait_exponential_max überschreitet, sind die nächsten beiden Die Verweilwerte zwischen Wiederholungsversuchen sind alle retrying. Dieses Design berücksichtigt den 2^previous_attempt_number * wait_exponential_multiplier-Algorithmus und kann Blockierungssituationen entschärfen. previous_attempt_numberretrywait_exponential_maxwait_exponential_maxWir können angeben, welche Ausnahmen wir erneut versuchen möchten, wenn eine Ausnahme auftritt. Verwenden Sie dazu retry_on_<a href="http://www.php.cn/.%20wiki/%20265.html" target="_blank">Ausnahme<code>exponential backoffÜbergeben Sie eine Funktion

    Objekt
  • :
  • retry_on_<a href="http://www.php.cn/wiki/265.html" target="_blank">exception</a>

Wenn während der Ausführung der Funktion

eine Ausnahme gemeldet wird, wird die Ausnahme als formaler Parameter
an die Funktion

übergeben. dann
def retry_if_io_error(exception):
 return isinstance(exception, IOError)
 
@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
 with open("file", "r") as f:
  return f.read()
, wenn nicht, stoppen Sie die Ausführung und

lösen Sie eine Ausnahme aus read_a_file. exceptionretry_if_io_errorexceptionWir können auch angeben, zu welchen Ergebnissen IOError wir gehen sollen, wenn wir sie erhalten. Dazu ist die Verwendung von retry erforderlich, um ein Funktionsobjekt zu übergeben:

retry Nach erfolgreicher Ausführung von retry_on_result wird der Rückgabewert

der Funktion

in Form des formalen Parameters
an die Funktion

übergeben
def retry_if_result_none(result):
 return result is None
 
@retry(retry_on_result=retry_if_result_none)
def get_result():
 return None
dann Go

, andernfalls beenden und den Funktionswert zurückgeben. get_resultresultZusammenfassungretry_if_result_noneNoneretry

[Verwandte Empfehlungen]1 🎜>Besonders empfohlen

: Download der Version „php Programmer Toolbox“ V0.1

2 Kostenloses Python-Video-Tutorial

3

Grundlegendes Python-Einführungs-Tutorial

Das obige ist der detaillierte Inhalt vonLösung zum erneuten Versuch, wenn eine Ausnahme auftritt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn