2012-01-24 2 views
1

У нас есть блок кода, который генерирует много исключений (по-видимому, IndexOutOfRangeException). Возможно, что он генерирует до 50 000/сек. Они пойманы, но процессор действительно всплескивает. Блок кода просто проверяет IDataRecord для столбца. Блок очень общий, и если столбец не существует, исключение поймано и возвращает логическое значение.Слишком много исключений .NET

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

Я просто ищу некоторые мысли.

+25

Исправить код. 'IndexOutOfRangeException' является одним из тех исключений, которые вы никогда не должны видеть! – leppie

+6

Работа с исключениями - неправильный подход. Я бы рекомендовал сосредоточиться на том, почему эти исключения бросаются. Обработка исключений не является бесплатной, и при этом объем не является легким. Этот тип исключения почти всегда можно избежать. –

+24

Во-первых, обычно в сотни раз дешевле исключить исключение, чем обрабатывать его. Во-вторых, доступ к несуществующему индексу - * ошибка *. Логика программы просто неверна. Не оставляйте обои поверх зияющего отверстия; закрепите отверстие. –

ответ

3

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

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

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

Ни в коем случае не следует полагаться на исключения для потока управления.

+0

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

+0

Так что лучший способ проверить, существует ли столбец? Можете ли вы привести пример кода для того, что описано во втором абзаце? – MrBoJangles

0

Если вы проверяете столбцы по индексу. Сначала вы должны избегать исключения. Используйте IsDBNull метод в IDataRecord вместо этого, больше информации here

И Да, вы должны проверить в первую очередь, если столбец существует, поэтому вы получаете IndexOutOfRangeException

0

«Единственный способ, которым я могу думать, чтобы исправить это итерации через столбцы IDataRecord, чтобы увидеть, есть ли столбец перед обработкой »

Эта ошибка возникает только в том случае, если вы находитесь за пределами массива. Вам не нужно пройти через каждую колонку, просто получить текущий столбец «количество»

for(int i = 0; i < column.count; i++) 
{ 
dowork(column[1]); 
} 

Из того, что я прочитал, исключение стоит около 5000-10000 тактовых циклов. Итерация по столбцам в большинстве случаев будет намного дешевле, но я уверен, что свойства объекта позволят вам узнать, сколько столбцов существует, не подсчитывая их каждый раз.

+0

Мы обращаемся к столбцу по имени, а не по индексу. – CYAD

+0

http://stackoverflow.com/questions/373230/check-for-column-name-in-a-sqldatareader-object "r.GetSchemaTable(). Columns.Contains (field)" – Bengie

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