Répéter une fonction en C# jusqu'à ce qu'il n'est plus déclenche une exception
J'ai une classe qui appelle une interface SOAP, et obtient un tableau de données. Cependant, si cette demande en temps, elle lève une exception. Que c'est bon. Cependant, je veux que mon programme pour tenter de faire appel à nouveau. Si c', je tiens à continuer à faire cet appel jusqu'à ce qu'il réussisse. Comment puis-je y arriver?
Par exemple:
try
{
salesOrdersArray = MagServ.salesOrderList(sessID, filter);
}
catch
{
?? What Goes Here to FORCE the above line of code to rerun until it succeeds.
}
Augmenter le délai d'attente afin de ne pas jeter de l'exception?
Il vous suffit d'appeler la méthode à nouveau à partir du bloc catch, MAIS - qu'advient-il si le service est arrêté pour une période de temps prolongée? Voulez-vous la méthode à exécuter de manière récursive pour 24 heures? Je recommande de limiter à un nombre défini de tentatives.
Sur l'ensemble de ces réponses, pas une seule personne vous dit de vous attraper un plus spécifiques exception. Que faire si votre bloc try contient des objets dans un état non valide pour obtenir le
Il vous suffit d'appeler la méthode à nouveau à partir du bloc catch, MAIS - qu'advient-il si le service est arrêté pour une période de temps prolongée? Voulez-vous la méthode à exécuter de manière récursive pour 24 heures? Je recommande de limiter à un nombre défini de tentatives.
Sur l'ensemble de ces réponses, pas une seule personne vous dit de vous attraper un plus spécifiques exception. Que faire si votre bloc try contient des objets dans un état non valide pour obtenir le
salesOrderList
? Nouvelle tentative n'aboutira jamais.OriginalL'auteur psyklopz | 2011-10-27
Vous devez vous connecter pour publier un commentaire.
Vous avez juste besoin de boucle pour toujours:
Notez que vous devez presque certainement pas en fait la boucle pour toujours. Vous devriez presque certainement avoir un nombre maximum de tentatives, et probablement le seul hic spécifiques exceptions. La capture de tous exceptions jamais peuvent être déplorables... imaginez si
salesOrderList
(non conventionnelles nom de la méthode, btw) throwsArgumentNullException
parce que vous avez un bug etfilter
est nul... ne vous vraiment voulez attacher à 100% de votre CPU pour toujours?J'étais en ajoutant le paragraphe ci-dessous - fondamentalement, le code répond à la question directement, mais le paragraphe explique que ce n'est probablement pas une bonne idée 🙂
+1 pour les exceptions spécifiques, j'étais en train de taper mon commentaire sur la question lors de votre montage.
Je sais, je fais des captures d'exceptions spécifiques, les erreurs SOAP, etc. Oublié les joies de la pause, merci.
Vous spécifiez le type d'exception dans le bloc catch:
catch (SoapException)
etc. Vous pouvez spécifier plusieurs différents types d'exceptions dans plusieurs blocs catch.OriginalL'auteur Jon Skeet
Si vous ne pouvez pas modifier le délai d'attente, le ci-dessous devrait fonctionner. salesOrdersArray doit être initialisée à
null
.OriginalL'auteur Matthew Flaschen
Il son pas gernally une bonne idead utiliser les exceptions que le contrôle de flux, mais cela va faire ce que vous avez demandé.
OriginalL'auteur rerun
Vous devez placer le bloc try/catch à l'intérieur d'une boucle de construire. Si vous ne souhaitez pas consommer 100% de votre processeur lieu à un Fil.Dormir dans le bloc catch, de sorte que chaque fois qu'une exception se produit, il faudra attendre un certain temps, libérant ainsi le processeur pour faire d'autres choses.
Vous pouvez également spécifier le type d'exception, de sorte que seul le délai d'attente exception est gérée, et d'autres types d'exceptions pass-through.
Noter que, TimeOutException devrait être remplacé par le nom réel de l'exception... je ne sais pas si c'est le vrai nom.
Également ajuster le temps de sommeil, donné dans millisecs et la quantité de répétitions, dans le cas que j'ai présenté, 100 répétitions de 1000ms donne un maximum d'attente de 1 minute et 40 secondes, ainsi que de la durée de l'opération elle-même.
OriginalL'auteur Miguel Angelo
Je vais utiliser un transactionnelle file d'attente (MSMQ) pour stocker de l'appel de service. Une boucle file d'attente des messages et appeler le service d'une TransactionScope, si l'appel échoue, le message semble être encore dans la file d'attente. Un ov ral délai d'attente peut être spécifié par l'ajout d'un temps d'expirer dans le message. Cette solution est bonne si vous voulez vraiment une solution fiable depuis que j'ai deviné que l'appel de cette opération est essentielle.
OriginalL'auteur Felice Pollano
Essayer
Le comportement que vous êtes après peut provoquer une boucle infinie si cela ne réussit jamais si...
OriginalL'auteur Jonatan Hedborg
Essayer quelque chose comme cela:
Edit: Wow! Les grands esprits se rencontrent! 🙂
OriginalL'auteur Rob H
Bien que je ne voudrais PAS vous recommandons de le faire pour un nombre infini de fois, vous pourriez faire une fonction distincte de cette seule phrase:
OriginalL'auteur Marnix
Cela permettra de courir en permanence, et est à l'aide d'exceptions, comme une boucle qui est lent. Est-il possible que vous pouvez modifier votre fonction qu'il renvoie la valeur null au lieu de lancer une exception? Si vous attendez que cet appel échoue régulièrement, ne pas utiliser un bloc try/catch.
OriginalL'auteur petebowden
J'ai suivi ce modèle afin de résoudre ce problème:
Essayez jamais ne semble pas être une bonne idée que vous pouvez finir par avoir une infinité de processus. Si vous pensez que vous avez besoin de plusieurs tentatives pour atteindre votre objectif, juste mis en grand nombre ici.
Personnellement, je pense que son plus sage d'attendre quelques millisecondes, ou secondes après eac tentative Fil.Sleep(1000); avant callig Send(data); --- vous pouvez par exemple, utiliser le attempNumber variable pour augmenter ou diminuer ce temps d'attente, si vous pensez que c'est judicieux pour votre scénario.
throw ex;
Ne le faites pas!pourquoi ne devrais pas je? Mon point est le même que Jon Skeet, ci-dessous le code qu'il a écrit
Ne pas
throw ex;
stackoverflow.com/questions/178456/... stackoverflow.com/questions/22623/...merci @asawyer ne savais pas à ce sujet donc j'ai édité ma réponse! est-ce que ça maintenant?
Deux choses: 1 - Vous presque jamais envie d'attraper la base de l'exception de la classe, et si vous le faites, il est à peu près uniquement à des fins de journalisation, puis
throw
ing de nouveau. 2 - ne Jamais jeter de la baseException
classe. Vous forcent à consommer de code dans la mauvaise pratique de la capture deException
. Utilisation d'une sous-classe appropriée, ou créer votre propre.OriginalL'auteur Renato Gama
OriginalL'auteur Albin Sunnanbo