Повторите метод или функцию 1 или более раз, если выдается исключение

1

У меня есть этот фрагмент кода (драйвер панели управления):

string strIP = ip1; //.Replace(',','.');
byte[] bytes = Encoding.UTF8.GetBytes(strIP);
unsafe
{
    fixed (byte* pIP = bytes)
    {
        int ddd = Huidu_InitDll(nSreenID, 2, pIP, strIP.Length + 1);
        if (ddd != 0)
        {
            MessageBox.Show("error");
            sendmail(Convert.ToString(Huidu_GetLastError()));
            return;
        }
    }
}

Много раз он выдает ошибку (и электронную почту) из-за высокого пинга, я думаю. Как решить это, например, попробуйте 3 раза, а затем отправьте отчет об ошибке?

  • 0
    использовать какую-то петлю? Где именно проблема?
  • 0
    куда именно выкидывает ошибку?
Показать ещё 1 комментарий
Теги:
methods
exception
function

3 ответа

3
Лучший ответ
int retries = 3;
bool done = false;
do
{
  try { YourFunction(); done = true; }
  catch { retries--; }
while (!done && retries > 0);

if (!done)
    ShowError();
3

Этот фрагмент кода, который я использовал в некоторых проектах, несколько раз пытается выполнить действие. Он пытается выполнить действие определенное количество раз, и если возникают различные типы исключений, он прерывается немедленно.

public static void Try(Action action, int tryCount = 3) {
    if (action == null)
        throw new ArgumentNullException("action");
    if (tryCount <= 0)
        throw new ArgumentException("tryCount");


    Exception lastException = null;
    bool lastTryFailed = true;
    int timesRemaining = tryCount;
    while (timesRemaining > 0 && lastTryFailed) {
        lastTryFailed = false;
        try {
            action();
        } catch (Exception ex) {
            if (ex != null && lastException != null &&
                !(
                    ex.GetType() == lastException.GetType() ||
                    ex.GetType().IsSubclassOf(lastException.GetType()) ||
                    lastException.GetType().IsSubclassOf(ex.GetType())
                )
            ) {
                throw new InvalidOperationException("Different type of exceptions occured during the multiple tried action.", ex);
            }

            // Continue
            lastException = ex;
            lastTryFailed = true;
        }
        timesRemaining--;
    }
    if (lastTryFailed) {
        throw new InvalidOperationException("Action failed multiple times.", lastException);
    }
}
1

Вы можете использовать простую базу механизмов повтора в цикле while и счетчике.

const int numTries = 3;
int currentTry = 0;
while (true)
{
   if (DoTheThing())
   {
      break;
   }
   currentTry++
   if (currentTry == numTries)
   {
      //throw or report error
      break;
   }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню