Наличие надежного и хорошо разработанного API-интерфейса исключений очень уместно. Использование этого для обеспечения соблюдения бизнес-правил также может быть целесообразным. На самом деле, по моему опыту, чем сложнее бизнес-правило, тем больше вероятность того, что оно будет обработано таким образом. Часто так же легко, если не проще, написать систему, в которой ожидаются исключения, чем написать авторитетную логику ветвления.
Это означает, что простые правила, которые можно описать в одном предложении, как правило, должны быть реализованы в превентивном или авторитетном порядке, в зависимости от того, что это такое. Однако, если у вас есть многомерное правило, требующее более трех или четырех факторов (особенно если выбор этих факторов основан на одном или нескольких других факторах), кодирование исключений может быть более приемлемым. Часто в этих случаях логический путь будет иметь много исключений предшественников, которые должны быть выброшены ((проверяет, почему действие не может быть выполнено), а затем (или наоборот) происходит сбой безопасности (чтобы проверить, разрешено ли действие ), иногда возникает некоторая авторитетная логика накопления, которую необходимо проверить (доступность потомка / предка, предшественник заявляет, что объекты должны быть помещены и т. д.)
Одно из преимуществ такого типа генерации исключений состоит в том, что он позволяет вам выделять и повторно использовать исключения-прекурсоры во многих областях вашего проекта. (Это суть аспектно-ориентированного программирования.) Делая это, вы инкапсулируете один конкретный аспект ваших общих бизнес-правил в автономный и поддерживаемый компонент. В целом эти компоненты будут соответствовать 1-1 с выданными сообщениями об ошибках. (Хотя иногда у вас будет один компонент, который выдает несколько разных исключений, вы почти никогда не должны создавать одно и то же исключение из нескольких компонентов.)
По моему мнению, труднее проектировать системы, основанные на исключениях, и первоначальное время разработки дольше, так как вы должны построить процесс исключения на всех N уровнях. Однако эти системы обычно оказываются гораздо более стабильными. Хотя никогда не бывает возможности разработать систему, которая «не выйдет из строя», преимуществом проектирования на основе исключений является то, что вы всегда предвидите сбой. Для большинства людей процесс может быть нелогичным. Это все равно, что спрашивать дорогу и попросить кого-нибудь рассказать вам все улицы, которые вы не должны включать.