Можно ли снова выполнить код в блоке try после исключения в блоке catch в catch? - PullRequest
18 голосов
/ 14 февраля 2012

Я хочу снова выполнить код в блоке try после обнаружения исключения.Возможно ли это как-то?

Например:

try
{
    //execute some code
}
catch(Exception e)
{
}

Если исключение перехватывается, я хочу снова войти в блок try, чтобы «выполнить некоторый код» и повторить попытку его выполнения.

Ответы [ 7 ]

37 голосов
/ 14 февраля 2012

Поместите это в петлю.Возможно, цикл while вокруг логического флага для контроля, когда вы, наконец, захотите выйти.

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.
  }
}

Только будьте осторожны, чтобы избежать бесконечного цикла.

Лучшим подходом может быть поставить ваш "некоторый код "в своем собственном методе, тогда вы можете вызывать метод как из try, так и catch, в зависимости от ситуации.

5 голосов
/ 14 февраля 2012

Если вы заключите свой блок в метод, вы можете рекурсивно вызвать его

void MyMethod(type arg1, type arg2, int retryNumber = 0)
{
    try
    {
        ...
    }
    catch(Exception e)
    {
        if (retryNumber < maxRetryNumber)
            MyMethod(arg1, arg2, retryNumber+1)
        else
            throw;
    }
}

или вы можете сделать это в цикле.

int retries = 0;

while(true)
{
    try
    {
        ...
        break; // exit the loop if code completes
    }
    catch(Exception e)
    {
        if (retries < maxRetries)
            retries++;
        else
            throw;
    }
}
4 голосов
/ 20 декабря 2017
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
    }
}
1 голос
/ 07 октября 2016

Что не так с оле goto?

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

                Thread.Sleep(1000);
                goto Start;
            }
1 голос
/ 14 февраля 2012

Есть еще один способ сделать это (хотя, как уже упоминалось, не очень рекомендуется).Вот пример использования повторной попытки загрузки файла для более точного соответствия ключевому слову retry, найденному в Ruby в VB6.

RetryLabel:

try
{
    downloadMgr.DownLoadFile("file:///server/file", "c:\\file");
    Console.WriteLine("File successfully downloaded");
}
catch (NetworkException ex)
{
    if (ex.OkToRetry)
        goto RetryLabel;
}
0 голосов
/ 14 февраля 2012

Это должно работать:

count = 0;
while (!done) {
  try{
    //execute some code;
    done = true;
  }
  catch(Exception e){
  // code
  count++;
  if (count > 1) { done = true; }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...