Почему я должен ставить блок 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
Из-за возможности множественных исключений, возникающих в цикле, которые вызывают ненужные накладные расходы в вашем приложении.
Если в нем обнаружена ошибка, то обработка вне цикла имеет больше смысла.