Обработка ошибок в трехуровневой архитектуре - PullRequest
6 голосов
/ 07 апреля 2009

Как правильно реализовать обработку ошибок? Например, мой уровень доступа к данным может потенциально выдавать 2 типа ошибок: 1) несанкционированный доступ, в этом случае страница должна все скрыть и просто показать сообщение об ошибке 2) ошибки, информирующие пользователя о том, что что-то подобное уже существует в базе данных (например, имя не уникально - например), и в этом случае я бы не хотел скрывать все.

РЕДАКТИРОВАНИЕ:

В результате некоторых комментариев здесь я придумал, что мне следует создавать производные специализированные типы исключений, такие как NotAuthorizedException, DuplicateException и т. Д. И т. Д. ... все в порядке, но я потенциально могу увидеть 2 проблемы:

1) Каждый сохраненный процесс имеет поле возврата p_error, в котором содержится сообщение об ошибке. После получения данных из БД мне нужно проверить это поле, чтобы увидеть, какой тип ошибки был возвращен, чтобы я мог выдавать соответствующие исключения. Итак, мне все еще нужно где-то хранить свои типы ошибок / сообщения об ошибках ..... Другими словами, как мне передать точное сообщение пользователю (в определенное время), без предварительной проверки поля p_error. Что возвращает меня к объекту ошибки. Кто-нибудь?

2) Я могу это потенциально превратить в кошмар, где количество исключений равно количеству типов сообщений об ошибках.

Я что-то здесь упускаю?

Большое спасибо всем!

Ответы [ 6 ]

4 голосов
/ 07 апреля 2009

Вы должны проверить блок обработки исключений в Enterprise Library . Множество полезных советов и программных средств, связанных с обработкой исключений и передачей их между слоями.

3 голосов
/ 07 апреля 2009

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

0 голосов
/ 05 октября 2009

Создайте свой собственный слой исключений.

DALExceptionManager DuplicateException DatabaseException

BLLExceptionManager NotAuthorizedException InvalidDateException

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

0 голосов
/ 07 апреля 2009

Блок обработки исключений в корпоративной библиотеке - это бомба, на которую указывают многие. Используя политики, вы можете делать такие вещи, как регистрация исключения, завершение его в другое исключение, создание нового исключения вместо исходного. Кроме того, если вы хотите выполнить определенные действия, основанные на ошибках аутентификации или дублирующих ошибках записей и т. Д., Вы всегда можете создать определенные производные классы исключений и перехватывать те типы исключений, которые исключают необходимость передачи каких-либо объектов сверху вниз. Исключения всегда должны всплывать, а не падать.

0 голосов
/ 07 апреля 2009

То, что происходит на верхних уровнях, зависит не от вашего уровня доступа к данным. Он даже не должен знать, что будут делать верхние слои. Если у вас есть ошибка дубликата ключа, он должен выдать что-то вроде «DuplicateKeyException». Если вы столкнетесь с ошибкой авторизации (я предполагаю, что вы имеете в виду «исключение»), то ничего с этим не делайте - пусть она возвращается обратно на уровень пользовательского интерфейса, который может отображать соответствующую страницу ошибки.

Помните, что значения ошибок и подобные вещи являются причиной, по которой мы изобрели исключения.

0 голосов
/ 07 апреля 2009

Один вариант, о котором я думал используя это создать класс ошибки, но тогда мне нужно будет передать его из интерфейса на бизнес-уровне, а затем к данным уровень доступа по ссылке

Я не уверен, что понимаю это. Вам не нужно передавать объект ошибки в каждом слое. Например, в одном из ваших примеров, errors that inform the user that something like this already exists in the database (say name not unique - for example), инфраструктура может вызвать исключение sql, и вам просто нужно перехватить конкретное исключение на бизнес-уровне или уровне пользовательского интерфейса.

Блок обработки исключений библиотекой Enterprise, предложенный другими людьми, позволит вам определить некоторую обработку исключений на основе политик в файле web.config. Это может быть хорошим местом, если вы хотите разработать какое-нибудь корпоративное приложение. Но для простого применения вам, возможно, не нужно заходить так далеко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...