Je veux exécuter le code dans le bloc d'essai après une exception est capturé. Est-ce possible en quelque sorte?
Pour par exemple:
try
{
//execute some code
}
catch(Exception e)
{
}
Si l'exception est attrapée, je veux aller à nouveau dans le bloc d'essai pour "exécuter du code" et réessayer pour l'exécuter.
Mettez-le dans une boucle. Peut-être une boucle de temps autour d'un drapeau booléen pour contrôler lorsque vous voulez enfin sortir.
bool tryAgain = true;
while(tryAgain){
try{
// execute some code;
// Maybe set tryAgain = false;
}catch(Exception e){
// Or maybe set tryAgain = false; here, depending upon the exception, or saved details from within the try.
}
}
Veillez simplement à éviter une boucle infinie.
Une meilleure approche peut être de placer votre "certains code" dans sa propre méthode, vous pouviez appeler la méthode des deux au cours de l'essai et de la capture, le cas échéant.
Si vous enveloppez votre bloc dans une méthode, vous pouvez l'appeler récursivement
void MyMethod(type arg1, type arg2, int retryNumber = 0)
{
try
{
...
}
catch(Exception e)
{
if (retryNumber < maxRetryNumber)
MyMethod(arg1, arg2, retryNumber+1)
else
throw;
}
}
ou vous pouvez le faire dans une boucle.
int retries = 0;
while(true)
{
try
{
...
break; // exit the loop if code completes
}
catch(Exception e)
{
if (retries < maxRetries)
retries++;
else
throw;
}
}
int tryTimes = 0;
while (tryTimes < 2) // set retry times you want
{
try
{
// do something with your retry code
break; // if working properly, break here.
}
catch
{
// do nothing and just retry
}
finally
{
tryTimes++; // ensure whether exception or not, retry time++ here
}
}
Il y a une autre façon de le faire (bien que d'autres l'ont mentionné, pas vraiment recommandé). Voici un exemple à l'aide d'un fichier télécharger Réessayer sur plus de près le mot-clé retry
trouvé in Ruby dans VB6.
RetryLabel:
try
{
downloadMgr.DownLoadFile("file:///server/file", "c:\\file");
Console.WriteLine("File successfully downloaded");
}
catch (NetworkException ex)
{
if (ex.OkToRetry)
goto RetryLabel;
}
Quel est le problème avec l'ole goto
?
Start:
try
{
//try this
}
catch (Exception)
{
Thread.Sleep(1000);
goto Start;
}