Подтвердить что ты не робот

Возможно ли повторить выполнение кода в блоке try после исключения в catch catch?

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

Например:

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

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

4b9b3361

Ответ 1

Поместите его в цикл. Возможно, цикл 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, если это необходимо.

Ответ 2

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

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

Есть и другой способ сделать это (хотя, как говорили другие, не рекомендуется). Здесь пример, использующий повтор загрузки файлов, чтобы более точно соответствовать ключевому слову 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;
}

Ответ 5

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

count = 0;
while (!done) {
  try{
    //execute some code;
    done = true;
  }
  catch(Exception e){
  // code
  count++;
  if (count > 1) { done = true; }
  }
}

Ответ 6

Что случилось с ole goto?

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

                Thread.Sleep(1000);
                goto Start;
            }

Ответ 7

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