2016-03-04 3 views
0

У меня есть функция, которая запускается раз в секунду таймером. Целью этой функции является запрос данных через API, а затем обновление списка и некоторых текстовых полей с результатами. По большей части он работает как часы, но каждые пару часов я получаю исключение ArgumentOutOfRangeException.Catch ArgumentOutOfRangeException

По какой-либо причине либо один запрос API не работает, либо список не обновляется достаточно быстро. В любом случае функция пытается обновить тексбокс и переменные, используя пустой список, следовательно, исключение ArgumentOutOfRangeException.

Теперь эти данные в большинстве случаев не хранятся в течение какого-либо периода времени, и функция будет запускаться снова в другой секунде в любом случае, если бы не ошибка при всплытии и остановке всего. Я не использовал C#, прежде чем я сделал эту программу, поэтому я не уверен, как лучше всего использовать инструкцию «catch», чтобы просто игнорировать программу и продолжать работу. На самом деле было бы хорошо, если бы количество сбоев регистрировалось в целочисленной переменной, чтобы программа могла определить, действительно ли что-то было неправильным, а не просто кратковременным сбоем. Как бы вы написали выписку для этого?

 try 
     { 
      GetQuoteResponse resp = GetQuoteResponse.GetQuote(questradeToken, quotesSymbolIds); 
      List<Level1DataItem> quotes = resp.Quotes; 

      QuoteStream_Data.Clear(); 
      for (int i = 0; i < quotes.Count; ++i) 
      { 
       Level1DataItem quote = quotes[i]; 
       QuoteStream_Data.Add(new QuoteStream_Entry { lastTradePrice = Convert.ToDecimal(quote.m_lastTradePrice)}); 
      } 

      XIVPriceBox.Invoke(new Action(() => XIVPriceBox.Text = QuoteStream_Data[0].lastTradePrice.ToString())); 
      HVIPriceBox.Invoke(new Action(() => HVIPriceBox.Text = QuoteStream_Data[1].lastTradePrice.ToString())); 
      TVIXPriceBox.Invoke(new Action(() => TVIXPriceBox.Text = QuoteStream_Data[2].lastTradePrice.ToString())); 

      XIVCurrentPrice = QuoteStream_Data[0].lastTradePrice; 
      TVIXCurrentPrice = QuoteStream_Data[2].lastTradePrice; 
     } 
     catch 
     { 

     } 
+0

я бы не стал. 'ArgumentOutOfRangeException' обычно происходит из-за ошибки ** programmer **, а не сбоя на стороне программы. Часть вашей программы может стать жертвой проблем с потоками. Где и как определяется «QuoteStream_Data»? Если это статично, это может быть частью вашей проблемы. Почему вы его очищаете? Вы принимаете только три записи, так почему бы не просто обычную ограниченную очередь? Почему вы не можете просто использовать (оставить в покое) старое значение, если нет нового? Вам даже нужен поток после этого, если было более трех записей? –

+0

QuoteStream_Data определен в верхней части открытого частичного класса формы: List QuoteStream_Data = новый List (); Я очищаю его, потому что мне нужен только список, достаточно долго, чтобы читать ценности в их надлежащие места. Если учесть, что он накапливает ценности, для меня будет более громоздким. –

+0

На самом деле должно было быть упомянуто, каждая из трех записей в списке представляет собой другой элемент. Это не история одного и того же предмета. –

ответ

1
try 
{ 
    // ... 
} 
catch(ArgumentOutOfRangeException ex) 
{ 
    LogException(ex); 
} 
+0

Вы предлагаете создать метод с именем LogException? Что делать? –

+0

Это просто пример. Если вы хотите, вы можете просто сказать 'catch (ArgumentException) {exceptionCount ++; } '. –

Смежные вопросы