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

Попробуйте, проблема с уловом

Я заметил, что эта проблема происходит много в большинстве вещей, которые я делаю, поэтому я думаю, что для этого должен быть шаблон дизайна.

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

Есть ли общий шаблон для такого рода вещей?

4b9b3361

Ответ 1

проверить этот ответ. надеюсь, что поможет u

Самый чистый способ записи логики повторения?

public static class RetryUtility
{
   public static void RetryAction(Action action, int numRetries, int retryTimeout)
   {
       if(action == null)
           throw new ArgumenNullException("action"); 

       do
       {
          try 
          {  
              action(); 
              return;  
          }
          catch
          { 
              if(numRetries <= 0) 
                  throw;  // Avoid silent failure
              else
              {
                  Thread.Sleep(retryTimeout);
                  numRetries--;
              }
          }
       } 
       while(numRetries > 0);
   }
}

Вызов

RetryUtility.RetryAction( () => SomeFunctionThatCanFail(), 3, 1000 );

Кредит отправляется Л.Бушкину

Ответ 2

Это выполняется неопределенно, но было бы легко добавить счетчик циклов к предложению while

    var solved = false;
    var tries = 0;

    while (!solved)
    {
         try
         {
            //Do Something
            solved = true;
         }
         catch
         {
             //Fix error
         } 
         finally
         {
              if(solved || IsRediculous(tries))
                 break;

              tries++;
         }
    }

Ответ 3

try/catch внутри цикла, счетчик для повторов?

EDIT: И ваше требование "повторить все, что бы оно ни делало", для этого вам нужна настраиваемая логика, как выполнять повторные попытки (диверсифицировать) (например, повторно открывать поток, воссоздавать объект, приостанавливать на X миллисекунды и т.д.), поэтому вам нужна его попытка try/catch внутри цикла для каждой атомной операции.

Под "атомной операцией" я подразумеваю набор связанных операторов, таких как чтение файла. Например, весь файл, считанный в память, может быть атомной операцией.

Ответ 4

На какой-то ограниченной основе вы можете поместить свою попытку /catch в цикл и принудительно перерыв, если это в конечном итоге будет успешным. Это может быть для тестирования интернет-доступа, и вы хотите, чтобы у пользователя была другая попытка подключения.

Ответ 5

Что-то вроде этого, может быть:

int MAX_RETRIES = 5;
for (var attempt=1; attempt <= MAX_RETRIES; attempt++) {
    try {
        DoSomethingThatMightThrow();
    }
    catch (AnExceptionIKnowHowToHandle) {
        if (attempt < MAX_RETRIES)
             continue;

        throw;
    }
}

Ответ 6

Да, довольно часто возникает цикл с рядом попыток, когда вы выходите из цикла с успехом. Несколько вещей:

Возможно, вы захотите добавить задержку перед повторной попыткой, чтобы не использовать все ваши попытки за несколько миллисекунд, прежде чем временная проблема успела исправить себя.

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

Ответ 7

Зависит от того, что вы пытаетесь, но обычно вы хотите проверить возможность возникновения исключения, которое ПРИОР для выполнения кода, который может вызвать исключение.

Например, убедитесь, что файл существует до его доступа, и создайте его (или что-то еще), если это не так.

Ответ 8

Вы уверены, что обработка исключений - это правильная методология? Если вы можете "решить проблему", вы, вероятно, можете обнаружить условие ошибки до вызова кода генерации исключения.

Обработка исключений наиболее естественна для вещей, которые действительно исключительны. Неудачное подключение к Интернету (как и в предыдущем ответе) - это то, что можно обнаружить и обработать до вызова кода исключения.

Ответ 9

Кодирование того, что уже упомянули другие люди:

var success = false;
var attempts = 0;
var maxAttempts = 0;

do {
  attempts++;

  try {
    /* your code */
    success = condition;
  } catch(SuperciliousException e) {
    /* recover */
  }
} while(!success && attempts < maxAttempts);