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