Я всегда чувствовал, что ожидать исключения на регулярной основе и использовать их в качестве логики потока было плохой вещью. Исключения выглядят так, как будто они должны быть " исключение ". Если вы ожидаете и планируете исключение, это может означать, что ваш код должен быть реорганизован, по крайней мере, в .NET ...
Тем не мение. Недавний сценарий заставил меня задуматься. Я опубликовал это на msdn некоторое время назад, но я бы хотел больше обсудить это, и это идеальное место!
Итак, скажем, у вас есть таблица базы данных, которая имеет внешний ключ для нескольких других таблиц (в случае, когда изначально возникла дискуссия, на нее указывали 4 внешних ключа). Вы хотите разрешить пользователю удалять, но только если нет ссылок на внешние ключи; Вы НЕ хотите каскадного удаления.
Обычно я просто проверяю, есть ли ссылки, и, если они есть, я информирую пользователя, а не делаю удаление. Очень легко и просто написать, что в LINQ связанные таблицы являются членами объекта, поэтому в Section.Projects и Section.Categories и т. Д. Удобно набирать с помощью intellisense и всех ...
Но дело в том, что LINQ затем должен поразить потенциально все 4 таблицы, чтобы увидеть, есть ли какие-либо строки результатов, указывающие на эту запись, и попадание в базу данных, очевидно, всегда является относительно дорогой операцией.
Руководитель этого проекта попросил меня изменить его, чтобы просто перехватить SqlException с кодом 547 (ограничение внешнего ключа) и обработать его таким образом.
Я был ...
устойчив .
Но в этом случае, вероятно, гораздо эффективнее поглотить накладные расходы, связанные с исключением, чем проглотить 4 обращения к таблице ... Тем более, что мы должны выполнять проверку в каждом случае, но мы исключили исключение в случае когда нет детей ...
Кроме того, база данных действительно должна отвечать за обработку ссылочной целостности, это ее работа, и она делает это хорошо ...
Таким образом, они выиграли, и я изменил это.
На каком-то уровне это все еще кажется мне неправильным .
Что вы, ребята, думаете об ожидающих и намеренно обработанных исключениях? Это нормально, когда кажется, что это будет более эффективно, чем проверка заранее? Это больше сбивает с толку следующего разработчика, смотрящего на ваш код, или меньше сбивает с толку? Насколько это безопаснее, поскольку база данных может знать о новых ограничениях внешнего ключа, о которых разработчик может и не подумать, чтобы добавить проверку? Или это вопрос перспективы того, что именно вы считаете лучшей практикой?