Где я должен справиться с исключениями, в BLL, DAL или PL?

StackOverflow https://stackoverflow.com/questions/3039236

  •  27-09-2019
  •  | 
  •  

Вопрос

Какое лучшее место для обработки исключений? BLL, DAL или PL?

Должен ли я позволить методам в Dal и BLL бросить исключения в цепочку и позволить PL обращаться с ними? Или я должен справиться с ними в BLL?

например

Если у меня есть метод в моем DAL, который выдает «ExecutenCerquery» и обновляет некоторые записи, а из-за одной или нескольких причин влияют 0 рядов. Теперь, как я должен позволить своему желанию знать, что произошло ли исключение или на самом деле не было никаких рядов, не совпадающих с условием. Должен ли я использовать «попробовать поймать» в моем коде PL и позволить ему знать сквозь исключение, или я должен обрабатывать исключение в DAL и вернуть какой-то специальный код, такой как (-1), чтобы позволить ФЛ дифференцировать между (исключением) и (нет Строки соответствовали условия, то есть затронутые нулевые ряды)?

Это было полезно?

Решение

Нет смысла, чтобы позволить исключить, что брошено в Dal Bubble до PL - как пользователь должен реагировать, если подключение к базе данных не может быть установлено?

Уловить и обрабатывать исключения рано, если Вы можете справиться с ними. Не просто проглотите их, не выводя подсказку или сообщение журнала - это приведет к серьезным трудностям и ошибкам, которые трудно отслеживать.

Другие советы

Это огромная тема с большим количеством ненужных противоречий (люди с громкими голосами, давая плохую информацию!) Если вы готовы иметь дело с этим, следуйте совету S1MM0T, он в основном согласен.

Однако, если вы хотите ответить на одно слово, положить их в пл. Серьезный. Если вы сможете уйти с ним, поместите вашу ошибку в обработчике глобального исключения (все ошибки должны входить в систему и дать код, чтобы посмотреть в систему производства в отношении соображений безопасности (ESP, если в Интернете), но дайте полную информацию во время разработки для соображения скорости).

Редактировать: (разъяснение) Вы должны иметь дело с некоторыми ошибками повсюду - но это не «каждая функция» нормы. Большую часть времени позволите им пузыми до глобальной ошибки PL и обрабатывать глобальную ошибку. ). Это означает, что вы будете нет попробуйте / cov посыпать через все свой код; Просто разделы, которые вы ожидаете и ошибка и можете обрабатывать ее прямо там, или, не критически важные разделы, с которыми вы регистрируете ошибку и сообщаете пользователям недоступных функциональных возможностей (это еще более редко и для супер надежных / критических программ)

Помимо этого, при работе с ограниченными элементами ресурсов я часто использую ключевое слово «Использование», либо попробуйте / Наконец / end Perress без улова. Для флагов-профилактики Mutex Lock / Re-Provention / etc. Вам также нужна попытка / наконец во всех случаях, поэтому ваша программа по-прежнему работает (особенно за горами).

Если вы используете исключения ненадлежащим образом (например, чтобы справиться с отсутствием ошибок, когда вы должны использовать оператор IF или проверку его операции IFFY, будет работать, прежде чем попробовать), эта философия распадет больше.

Боковая заметка, в толстых клиентских приложениях, особенно когда есть возможность потерять значительные суммы или ввод пользователей, вы можете быть лучше, чтобы больше попробовать / уловить, где вы пытаетесь сохранить данные (помечены как еще недействительны. ).

РЕДАКТИРОВАТЬ: другая необходима по крайней мере Регулятор регистрации в PL - Это будет работать по-разному в зависимости от платформы. Приложение, которое мы работаем над акциями, разделяем BLL / DAL с версиями 3 PL: версию ASP.NET, версию WinForms и версия регрессионной тестирования регрессионной тестирования регрессии консоли. Продолжительность ведения журнала, которая называется на самом деле в BLL (дал только бросает ошибки или полностью обрабатывает все, что он получает или повторно бросает их). Однако это поднимает событие, которое обрабатывается PL; В сети он ставит его в журнал сервера и отображение сообщения об ошибке в стиле веб-стиля (дружественное сообщение для производства); В WINFORMS Окно «Специальное сообщение» появляется с информацией о техническом обслуживании Tech и т. Д. И регистрирует ошибку за кулисами (разработчики могут сделать что-то «секретное», чтобы увидеть полную информацию). И, конечно, в версии тестирования это гораздо простой процесс, но и отличается.
Не уверен, как я бы сделал это в BLL, за исключением прохождения параметра «какую платформу», но поскольку он не включает в себя WinForms или библиотеки ASP, которые зависят от того, что все еще будет трюк.

Краткий ответ - это зависит!

Вы должны только справиться только за исключением, если вы можете сделать что-то полезное с ним. «Что-то полезное» снова зависит от того, что вы делаете. Вы можете захотеть войти в систему деталей исключения, хотя это на самом деле не обрабатывает его, и вы должны действительно перебросить исключение после входа в систему в большинстве случаев. Вы можете захотеть обернуть исключение в каком-то другом (возможно, на заказ) исключения, чтобы добавить дополнительную информацию для исключения. Как @mbeckish касается, вы можете попробовать оправиться от исключения, например, например, повторная попытка операции - вы должны быть осторожны, чтобы не повторить навсегда. Наконец (извините на каламбуре), вы можете использовать, чтобы воплотить блок для очистки любых ресурсов, таких как открытое соединение БД. Что вы решите сделать с исключением, будут влиять на то, где вы обрабатываете его. Вполне вероятно, что нет много полезных вещей, которые могут быть сделаны со многими исключениями, отличными от того, чтобы сообщить пользователю, что произошла ошибка, в этом случае будет более чем приемлемым для обработки исключения в слое UI И сообщите о проблеме пользователю (вы, вероятно, должны и исключить исключение, и дальше вниз по своим слоям).

Когда вы бросаете исключения, вы должны когда-либо бросать исключения только в «исключительных оккументах, так как есть большие накладные расходы в бросках исключения. В вашем примере вы предлагаете, вы можете думать о том, чтобы выбрать исключение, если записи не обновляются вашей операцией. Это действительно исключительно? Лучшая вещь, которую нужно сделать в этой ситуации, будет возвращать количество обновленных записей - это все равно может быть условием ошибки, которое необходимо сообщать пользователю, но не исключительно, похоже на неудачу команды, потому что соединение к DB понизился.

Этот это разумная статья об исключении чрезвычайной практики.

Слой, который знает, что делать, чтобы настроить правильные вещи, должен быть слоем, который обрабатывает исключение. Например, если вы решите обрабатывать ошибки тупиковых ошибок, повторяя запрос определенного количества раз, вы можете построить это в свой DAL. Если он продолжает проваливаться, то вы можете позволить исключить пузырь до следующего слоя, который может затем решить, знает ли он, как правильно обрабатывать это исключение.

Все слои в вашем приложении должны управлять исключениями изящными. Это известно как поперечное вырезанное кукурирование, потому что он появляется во всех ваших слоях. Я верю, что, используя тарифные рамки, подобные блок Enterprise Exception с единством, вы получите лучший код в целом. Посмотрите на этот пост

http://msdn.microsoft.com/en-us/library/ff664698(v=pandp.50).aspx.

Это займет некоторое время, чтобы освоить его, но вокруг там есть много примеров и скрингастов.

Как обрабатывать исключения зависит от технических и деловых потребностей. Для сложных или очень важных обновлений базы данных я включаю свои параметры, которые передают небольшой список известных ошибок резервного копирования к DL. Таким образом, в некоторых случаях могут быть программно решены известные сценарии ошибок. В других случаях ошибка должна быть зарегистрирована, и пользователь должен быть уведомлен о ошибке.

Я делаю практику уведомлять человека ошибок. Конечно, регистрация даст нам подробную информацию, но не замена времени отклика человека. Не только это, но зачем заставить разработчиков смотреть системные журналы, чтобы увидеть, пойдет ли вещи на юг? Говорить о ненужных целях.

Если у вас есть время, чтобы определить потенциальные ошибки / исключения и программно решать их, то всеми способами сделать это. Много раз ошибки / исключения неожиданно. Вот почему важно быть готовым к этому неожиданному и какому лучшему способу сделать это, чем вовлечение человека.

В целом, нужно быть на обороне, при планировании обработки исключений. Программы растут или они умирают. Часть выращивания представляет ошибки. Так что не раскрутите свои колеса, пытаясь убить их всех.

Вопрос к вам - это то, где является исключением актуальным? Если это исключение доступа к данным, оно должно быть поймано в DAL. Если это логическое исключение, оно должно быть поймано в BLL. Если это исключение презентации, то в пл.

Например, если ваш DAL выбрасывает исключение, это должно вернуть нулевую или ложное или все, что может быть в вашем BLL. Ваш BLL должен знать, что делать, если DAL возвращает NULL, может быть, он проходит вправо, возможно, он пытается вызывать другую функцию и т. Д. То же самое касается вашего PL, если BLL проходит через нулевой, или возвращает что-то конкретное Тогда слой презентации должен иметь возможность уведомить конечный пользователю, что произошла проблема.

Конечно, вы не получите сообщения ослабленного исключения, но это хорошая вещь, насколько касается ваших пользователей. У вас должна быть гибкая система ведения журнала, чтобы поймать эти исключения и сообщить об ними в базу данных или IP-адрес: порт или что вы решите.

По сути, вы должны думать с точки зрения разделение опасений Если проблема является проблемой данных или логическая проблема, оно должно соответственно обрабатывать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top