Gérer les erreurs du SDK Python sans dupliquer les résolutions
Un délai de connexion dépassé ne prouve pas que la création de la tâche a échoué. Conservez les données d’entrée d’origine de la tâche et son requestId ; reprenez cette requête avant de lancer une autre résolution.
Sur cette page
Intercepter les échecs de tâche séparément des erreurs HTTP
La méthode solve du SDK Python synchrone crée une tâche une seule fois et l’interroge jusqu’à ce qu’elle soit prête ou qu’une erreur soit levée. Interceptez les exceptions spécifiques avant SolvethreeError pour pouvoir distinguer une résolution échouée d’une requête HTTP interrompue.
Définissez SOLVETHREE_API_KEY et SOLVETHREE_PROXY, puis remplacez le nom d’hôte et l’action de l’exemple par les valeurs de votre cible. Le site doit disposer d’un profil actif dans l’espace de travail avant de pouvoir faire l’objet d’une résolution.
import os
import uuid
from solvethree import Solvethree, ApiError, TaskFailedError, SolvethreeError
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
task = {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"], "requestId": str(uuid.uuid4())}
try:
result = client.solve(task, timeout=180)
print("Ready task:", result["id"])
# Submit result["solution"] privately through the target application.
except TaskFailedError as error:
print("Failed task:", error.task_id, "code:", error.error_code)
# This task is terminal. Inspect it before starting different work.
except ApiError as error:
print("HTTP status:", error.status, "retry delay:", error.retry_after)
print("Recovery IDs:", error.request_id, error.task_id)
# A known task_id means resume get_task; otherwise replay the exact task
# with error.request_id. Do not generate a new logical request to recover it.
except SolvethreeError as error:
print("Recovery IDs:", error.request_id, error.task_id)
# Save these IDs and the original task inputs for explicit recovery.TaskFailedError: la tâche a atteint le statut définitiffailed. Examinezerror.task_ideterror.error_code; ne continuez pas à interroger cette tâche.ApiError: une requête HTTP a échoué. Examinezerror.statuseterror.retry_after, exprimé en secondes. Il ne s’agit pas d’un échec définitif de la tâche.SolvethreeError: conservezerror.request_ideterror.task_idpour une reprise explicite. Utilisez les identifiants disponibles au lieu de supposer que la création n’a jamais eu lieu.
L’exemple affiche les informations de reprise, mais ne les conserve pas durablement et n’effectue pas de reprise. Dans une intégration qui doit résister à un redémarrage du processus, enregistrez les données d’entrée d’origine de la tâche et l’identifiant de requête avant d’appeler solve, puis conservez tout identifiant de tâche renvoyé. Protégez les données d’entrée stockées qui contiennent des identifiants de connexion au proxy.
Reprendre par identifiant de tâche ; récupérer une création par identifiant de requête
- 1.
Si vous disposez d’un task_id, reprenez avec get_task
Récupérez cette tâche au lieu de rappeler
solve.get_taskaccepte l’identifiant de tâche et un argumentwait_ms; son attente par défaut est de 15000 millisecondes. Continuez tant que le statut estpendingousolving. N’utilisez la solution que lorsque le statut estready, et arrêtez-vous surfailed. - 2.
Si la création a été interrompue avant la réception d’un identifiant de tâche, relancez create_task
Envoyez les mêmes données d’entrée avec le même
requestId, en utilisant lerequest_idrécupéré si nécessaire. Réutiliser cet identifiant avec la même requête renvoie la tâche existante ; modifier les données d’entrée provoque un conflit. Une fois l’identifiant de tâche obtenu, continuez avecget_task. - 3.
Ne générez pas d’autre identifiant pendant la reprise
L’exemple génère son UUID avant d’appeler
solve. Conservez cette valeur lors de la reprise ; ne reconstruisez pas la tâche au risque de la remplacer accidentellement. Un nouvel identifiant représente une requête distincte, pas une nouvelle tentative de la requête interrompue.
Le SDK génère un requestId si vous l’omettez, expose les identifiants de reprise dans les erreurs et ne réessaie jamais automatiquement la création d’une tâche. Pendant solve, il respecte Retry-After pour les échecs temporaires d’interrogation, dans la limite du délai de résolution. Si l’appel lève malgré tout une exception, utilisez les identifiants enregistrés pour reprendre au lieu de lancer une autre résolution.
La reprise ne justifie pas de répéter des requêtes invalides
Pour ApiError, examinez l’erreur HTTP avant de décider de renvoyer quoi que ce soit. Reprendre une création interrompue est approprié lorsque son résultat est incertain ; renvoyer aveuglément des données d’entrée invalides inchangées ne l’est pas.
Pour TaskFailedError, la tâche est terminée. Une tâche échouée récupérée contient errorCode et error ; l’exception Python expose le code via error.error_code. Utilisez ces informations pour déterminer ce qui doit changer. Par exemple, site-unreachable nécessite de vérifier l’accessibilité de la cible, et non de supposer que le compte manque de crédit. Les résolutions échouées sont remboursées.
Sources et référence de l’API
Lancez votre première tâche.
Démarrez avec $5 de crédit dans votre espace de travail.