Как лучше всего обрабатывать исключения ObjectDataSource?

У меня есть ObjectDataSource на странице ASPX, вызывающей операции CRUD из класса бизнес-логики. Когда во время этих операций возникают исключения, я хотел бы информировать пользователей об ошибках, а также регистрировать их. Но я хочу четкого разделения между моей бизнес-логикой и уровнем представления. Я знаю, что события Selected, Inserted, Updated, Deleted предоставляют параметр типа ObjectDataSourceStatusEventArgs, который включает свойство «Исключение» для возникших исключений.

Являются ли обработчики этих событий лучшим местом для обработки исключений для ObjectDataSource или есть лучший способ? Соответствует ли свойство Exception цепочки параметров события всем исключениям, возникшим во время операции?

Любые комментарии или предложения приветствуются,

Спасибо,

Каллен


person Leo Nix    schedule 18.04.2009    source источник


Ответы (2)


Когда исключение возникает во время операции CRUD, выполняемой вашим объектом уровня Biz, оно должно быть обработано объектом Biz, но частично. Это связано с тем, что вы хотите, чтобы обратная связь достигла уровня представления (и вы также хотите зарегистрировать ошибку). Таким образом, вы можете:

а. Повторно сгенерируйте исключение как есть. Это поднимет его к вашему слою презентации.

б. Добавьте пару данных "имя-значение" в свойство Data исключения, а затем повторно создайте его.

в. Оберните возбужденное исключение в настраиваемый тип исключения и выдайте его.

Затем это исключение будет передано в ваш ObjectDataSource и будет доступно через свойство ObjectDataSourceStatusEventArgs.Exception в вашем обработчике событий Selected/Inserted/Deleted/Updated. Затем вы должны проверить, является ли это свойство нулевым. Если нет, ObjectDataSource оборачивает любые исключения (да, во множественном числе!) в оболочку TargetInvocationException, так что вам, вероятно, потребуется добраться до InnerException.

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

Что касается регистрации исключения, лично я бы зарегистрировал ошибку на обоих уровнях — уровне логики Biz и уровне представления.

person Cerebrus    schedule 18.04.2009

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

Я думаю, что цель этих событий такова: показать ошибку каким-то нестандартным способом.

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

Что-то вроде этого при вставке/обновлении человека:

if (Person.Save(data)) {
  // show OK message
} else {
  // show error message
}

где Person — это класс BAL, относящийся к классу уровня доступа к данным Person.

Надеюсь, это поможет.

person eKek0    schedule 18.04.2009