Почему я должен ставить блок try/catch из цикла?

Вот команда CodeReview Guideline от команды Practice & Patterns. http://msdn.microsoft.com/zh-cn/library/ms998574#scalenetchapt13_topic7 (ссылка автоматически переходит в раздел Исключения).

Они сказали, что вы должны поставить блок try/catch из цикла, когда вы обрабатываете исключение, я хочу знать, почему?

Ответ 1

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

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

Ответ 2

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

Если вы поставите блок try/catch за пределы цикла, вам нужно будет обработать только одно исключение.

Ответ 3

A try/catch внутри цикла ведет себя не так, как за пределами цикла, если только он не вызывает повторение исключения.

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

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

Но разумно игнорировать рекомендацию, если это то, что диктуют ваши требования. Чтобы взять простой, но устаревший пример, в мире без Int32.TryParse (.NET 1.x было не так давно!), Было бы разумно иметь цикл, который анализирует список строк в целые числа, используя Int32.Parse в try/catch внутри цикла.

Ответ 4

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

Если в нем обнаружена ошибка, то обработка вне цикла имеет больше смысла.