Это огромная тема с множеством ненужных споров (люди с громкими голосами, дающими плохую информацию!) Если вы готовы с этим справиться, следуйте советам s1mm0t, это в основном приемлемо.
Однако, если вы хотите ответить одним словом, поместите их в PL. Серьезно. Если вам это удастся, поместите свою обработку ошибок в глобальный обработчик исключений (все ошибки должны регистрироваться и давать код для просмотра журнала в рабочих целях по соображениям безопасности (особенно в Интернете), но при этом предоставить полную информацию во время разработки для из соображений скорости).
Редактировать: (уточнение) Вы должны иметь дело с некоторыми ошибками везде - но это не норма «каждая функция». Большую часть времени они позволяют пузырям доходить до PL и обрабатывают глобальную ошибку .NET с помощью собственного кода: регистрируйте полный стек вызовов оттуда с помощью обычной подпрограммы, доступной для всех трех уровней через обработчики событий (см. EDIT внизу сообщения). ). Это означает, что вы не будете пытаться / поймать весь код; только те разделы, которые вы ожидаете, и ошибки, и которые можно обработать прямо здесь, или некритические разделы, с помощью которых вы регистрируете ошибку и информируете пользователя о недоступной функциональности (это еще реже и для сверхнадежных / критических программ)
Кроме того, при работе с элементами с ограниченными ресурсами я часто использую ключевое слово 'using' или try / finally / end try без подвоха. для многопоточных блокировок / мьютексов / флагов предотвращения повторного входа / и т. д. вам также нужно попробовать / наконец во ВСЕХ случаях, чтобы ваша программа все еще работала (особенно приложения с состоянием).
Если вы используете исключения ненадлежащим образом (например, чтобы иметь дело с не-ошибками, когда вы должны использовать оператор IF или проверять его, сработает сомнительная операция, прежде чем вы ее попробуете), эта философия больше развалится.
Дополнительное замечание: в толстых клиентских приложениях, особенно когда есть вероятность потери значительных сумм или ввода данных пользователем, вам может быть лучше с большим количеством попыток / уловов, когда вы пытаетесь сохранить данные (помеченные как еще не действует конечно).
РЕДАКТИРОВАТЬ: еще одна необходимость хотя бы иметь процедуру регистрации в PL - это будет работать по-разному в зависимости от платформы. Приложение, над которым мы работаем, использует BLL / DAL с версиями 3 PL: версией ASP.Net, версией winforms и версией для регрессивного тестирования в пакетном режиме консольного приложения. Вызываемая подпрограмма регистрации в действительности находится в BLL (DAL только выдает ошибки или полностью обрабатывает все, что получает, или перебрасывает их). Однако это вызывает событие, которое обрабатывается PL; в Интернете он помещает его в журнал сервера и выводит сообщение об ошибке в веб-стиле (дружественное сообщение для производства); в WinForms появляется специальное окно сообщения с информацией о технической поддержке и т. д., которое регистрирует закулисную ошибку (разработчики могут сделать что-то «секретное», чтобы увидеть полную информацию). И, конечно, в тестовой версии это гораздо более простой процесс, но также и другой.
Не уверен, как бы я это сделал в BLL, за исключением передачи параметра «какая платформа», но, поскольку он не включает в себя winforms или asp-библиотеки, от которых зависит ведение журнала, это все равно будет хитростью.