Вопрос

У меня есть метод BO, который должен выполнить две операции, чтобы выполнить свой контракт.

  1. вставить запись в базу данных
  2. отправьте уведомление по электронной почте, содержащее метаданные для записи

Оба обрабатываются вызовами отдельных методов DAO, ответственных за выполнение действия.

Я не перехватываю исключения в своем DAO, я обрабатываю и публикую их в BO.Первый вызов - это DAO для вставки, и он может вызвать исключение NullReferenceException или одно из исключений sql.Метод электронной почты использует SmtpClient.Отправка, которая может вызывать множество исключений.

Можно ли заставить дочерний метод, который вызывает функциональность электронной почты, возвращать только один тип исключения, пользовательский, через атрибут?

Чтобы проиллюстрировать это:

public void AddSupportTicket(SupportTicketDTO ticket)
{
    try
    {
        supportTicketDAO.Insert(ticket);
        email.SendNotification(ticket);
    }
    catch (ExceptionA exc) { ... } // both of the methods can throw exceptions that
    catch (ExceptionB exc) { ... } // can overlap.  I just care about returning       
    catch (ExceptionC exc) { ... } // a custom EmailException or DataException
}

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

Как я должен эффективно генерировать правильное пользовательское исключение?

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

Решение

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

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

Если вы используете WCF, вы можете указать, какое исключение может быть выдано из данной функции, поэтому в интерфейсе вашего сервиса у вас будет что-то вроде

[OperationContract]
[FaultContract(typeof(MemberAlreadyExistsException))]
void MemberInsert(Member mu);

Не знаю насчет атрибута, но вы не могли бы просто это сделать:

try{
...
} catch(Exception ex) {

  throw new MyException("Some biz msg", ex);
}

C # не предоставляет функциональности, подобной Java throws ключевое слово, если вы это имеете в виду.Вы можете документировать типы исключений, которые выдает ваш code my, с помощью стандартов документации XML, но нет способа принудительно выполнить это по контракту.

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

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