Рассмотрим контракт, который вы навязываете абонентам SendMail. Они обязаны передать вам «действующий адрес электронной почты». Кто решает, что действительно? SendMail делает. По сути, ваш метод - «высокий уровень обслуживания» - он хочет, чтобы все было так, как ему хочется, и единственный способ определить, будет ли то, что вы собираетесь дать, будет удовлетворительным, - это попытаться надеяться на лучшее.
Не пишите методы с высокими эксплуатационными расходами, не давая звонящему возможность узнать, как его удовлетворить, или, по крайней мере, не избегайте исключения. Извлеките логику проверки в метод IsValidAddress, который возвращает логическое значение. Затем вызовите метод SendMail, вызывающий IsValidAddress, и выведите его, если он недопустим.
Вы получите несколько хороших эффектов от этого изменения:
(1) Увеличенное разделение интересов. Задача SendMail - заставить механизм электронной почты работать, а не выносить суждение о том, является ли адрес электронной почты действительным. Изолируйте это политическое решение на код, специализирующийся на проверке.
(2) Проверка адреса сама по себе является полезным инструментом; Есть много случаев, когда вы хотите узнать, правильно ли сформирован адрес, не отправляя на него почту.
(3) Вы можете легко обновлять и улучшать свою логику проверки, потому что она все в одном разумном месте.
(4) У звонящих есть способ, которым они могут гарантировать, что никакие исключения не будут выброшены. Если вызывающая сторона не может вызвать метод, не гарантируя, что аргументы верны, тогда они должны перехватить исключение. В идеале вы никогда не должны заставлять вызывающего абонента обрабатывать исключение, чтобы сделать их код правильным; должен быть способ, которым они могли бы написать правильный код, который никогда не генерирует, даже если данные, которые они получили, неверны.
Вот несколько статей на эту тему, которые я написал для вас:
Обработка исключений: http://ericlippert.com/2008/09/10/vexing-exceptions/
Методы интенсивного технического обслуживания: http://blogs.msdn.com/ericlippert/archive/2008/09/08/high-maintenance.aspx