Исключение первого шанса типа «System.IndexOutOfRangeException» в exe в окне вывода

Я запускаю программу формы Windows, которая выполняет всю свою работу в другом потоке. Через некоторое время пользовательский интерфейс зависает и перестает отвечать. Фоновый поток все еще работает нормально (я вижу это по проделанной работе).

Я получил это исключение:

Исключение первого шанса типа «System.IndexOutOfRangeException» в exe

Когда я проследил строку исключения и снова запустил ее, я получил это:

Поток <No Name> (0x19b4) завершился с кодом 0 (0x0).

Строка кода работает нормально, но выдает ошибку System.IndexOutofRangeException.

MatchCollection tempcollection = Regex.Matches(document,
        "(?<data>More information from(.|\\r|\\n)*?</div>)");
if (tempcollection.Count == 0)
{
    return Result;
}
string ThisDiv = tempcollection[0].Groups["data"].Value;
// The above line shows exception in Output Window,
// otherwise it works fine and moves to next line.

ОБНОВЛЕНИЕ: я видел, что выходные данные предоставляют информацию о каждом исключении, независимо от того, перехвачено оно или нет, я думал, что это является причиной зависания пользовательского интерфейса, но это не так.

  1. Пожалуйста, помогите мне избавиться от этого исключения.
  2. Это непроверенное исключение; В ходе учебы я узнал, что в .Net нет непроверенных исключений. Пожалуйста, разъясните это для моего понимания.

person Charlie    schedule 27.03.2015    source источник
comment
Почему бы вам не поместить строку tempcollection[0].Groups[data].Value внутри оператора if if (tempcollection.Count != 0)? Если счетчик равен 0, string ThisDiv = tempcollection[0].Groups[data].Value; вызовет исключение Out of Range.   -  person Sormita Chakraborty    schedule 27.03.2015
comment
@SormitaChakraborty Это вызов самого Count вызывает исключение. У меня такая же проблема.   -  person João Mendes    schedule 19.07.2019


Ответы (1)


Регулярное выражение могло не возвращать значение группы, а tempcollection[0].Groups["data"] может не быть установлен, поэтому индексатор в группе выйдет из строя, и вы можете получить исключение индекса вне диапазона, попробуйте добавить нулевую проверку для того же прежде чем попытаться получить от него значение.

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

person Neeraj    schedule 27.03.2015
comment
позвольте мне проверить это, Neeraj это непроверенное исключение, почему оно не поймано - person Charlie; 27.03.2015
comment
В Java есть концепция определения того, через что может пройти метод, не только через комментарии, но и как часть семантики кода. .Net, в свою очередь, не имеет этой семантики, но вместо этого вся такая информация является частью документации по таким методам. Итак, для «int.Parse» (msdn. В документации по коду методов microsoft.com/en-us/library/b3h1hf19(v=vs.110).aspx) указано, что он может иметь эти исключения. Вам придется явно написать свой код на основе этой документации для обработки любых ожидаемых исключений. Примерно так, как показано ниже: try { // логика регулярного выражения } catch (IndexOutOfRangeException iore) { // другая логика } - person Neeraj; 27.03.2015
comment
@Neeraj Это вызов самого Count вызывает исключение. У меня такая же проблема. - person João Mendes; 19.07.2019
comment
Вы получаете индекс вне диапазона при подсчете? Если вы не возражаете, фрагмент поможет. - person Neeraj; 23.07.2019