Maison > Article > développement back-end > Solution pour réessayer lorsqu'une exception se produit
Cet article vous présente principalement la solution aux nouvelles tentatives anormales en Python. L'introduction dans l'article est très détaillée. Je pense qu'elle a une certaine valeur d'apprentissage de référence pour que tous les amis qui en ont besoin puissent apprendre ou utiliser Python. . Jetons un coup d'oeil.
Avant-propos
Lorsque tout le monde effectue une capture de données, ils rencontrent souvent des sauvegardes de programmes en raison de problèmes de réseau. Auparavant, ils n'enregistraient que des erreurs. et post-traitez le contenu de l'erreur.
Processus original :
def crawl_page(url): pass def log_error(url): pass url = "" try: crawl_page(url) except: log_error(url)
Processus amélioré :
attempts = 0 success = False while attempts < 3 and not success: try: crawl_page(url) success = True except: attempts += 1 if attempts == 3: break
Nouvelle solution récemment découverte : réessayer
réessayer est un Python Le package retry peut être utilisé pour réessayer automatiquement certains segments de programme susceptibles d'échouer. retrying
Fournir une fonction de décorateur retry
La fonction décorée sera réexécutée si elle échoue. Par défaut, elle continuera à réessayer tant qu'une erreur est signalée.
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()
Si nous exécutons la fonction have_a_try
, elle ne se terminera que lorsque random.randint
renvoie 5, sinon elle sera réexécutée.
retry peut également accepter certains paramètres. Depuis la fonction d'initialisation de la classe Retrying dans le code source, vous pouvez voir les paramètres facultatifs :
s<a href="http://www.php.cn/wiki/904.html" target="_blank">top<p>_max_attempt_number</p></a>
: utilisé pour définir le maximum Le nombre de tentatives cessera de réessayer s'il dépasse ce nombre s<a href="http://www.php.cn/wiki/904.html" target="_blank">top</a>_max_attempt_number
: Par exemple, s'il est réglé sur 10000, il démarrera à partir du moment où le décoré La fonction commence à s'exécuter et se termine lorsque la fonction s'exécute avec succès. Ou au moment où l'échec est signalé et terminé. Tant que cette période dépasse 10 secondes, la fonction ne sera plus exécutée stop_max_delay
: Régler le séjour entre deux wait_fixed
Temps retrying
: Générer le temps de séjour entre deux wait_random_min和wait_random_max
de manière aléatoire retrying
: Utiliser exponentielle Le formulaire génère le temps de séjour entre deux wait_exponential_multiplier和wait_exponential_max
, et la valeur générée est retrying
est le nombre de fois que 2^previous_attempt_number * wait_exponential_multiplier
a été. fait avant. Si la valeur générée dépasse la taille de previous_attempt_number
, alors les deux valeurs de maintien entre les nouvelles tentatives sont toutes retry
. Cette conception répond à l'algorithme wait_exponential_max
et peut atténuer les situations de blocage. wait_exponential_max
exponential backoff
retry_on_<a href="http://www.php.cn/.%20wiki/%20265.html" target="_blank">exception<li></a>
Passer une fonctionobjetretry_on_<a href="http://www.php.cn/wiki/265.html" target="_blank">exception</a>
:
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(), si une exception est signalée, l'exception sera transmise à la fonction
comme paramètre formel read_a_file
Si exception
est retry_if_io_error
, alors exception
, sinon, arrêtez de fonctionner et IOError
lancez une exception retry
.
Nous pouvons également spécifier à quels résultats aller
pour transmettre un objet fonction : retry
retry_on_result
Après une exécution réussie de
def retry_if_result_none(result): return result is None @retry(retry_on_result=retry_if_result_none) def get_result(): return Nonede la fonction
sera transmise à la fonction get_result
sous la forme d'un paramètre formel si la valeur de retour est. puis Go result
, sinon terminez et renvoyez la valeur de la fonction. retry_if_result_none
None
retry
[Recommandations associées]
1. 🎜>Spécialement recommandé
: Téléchargement de la version "php Programmer Toolbox" V0.12. Tutoriel vidéo gratuit sur Python
3 Tutoriel d'introduction de base de Python
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!