web-dev-qa-db-fra.com

Est-il possible d'exécuter le code dans le bloc d'essai après une exception dans la prise de blocage dans le bloc de capture?

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.

18
Infant Dev

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.

38
ziesemer

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;
    }
}
5
SynXsiS
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
    }
}
4
David Smith
3
Mickey Perlstein

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;
}
1
Bill

Quel est le problème avec l'ole goto?

 Start:
            try
            {
                //try this
            }
            catch (Exception)
            {

                Thread.Sleep(1000);
                goto Start;
            }
1
LastTribunal