C # Контрактные реализации и исключения - PullRequest
0 голосов
/ 02 мая 2009

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

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

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

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

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

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

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, а затем - одним в пользовательском интерфейсе для перенаправления на интеллектуальная ошибка, так что это не звучит здорово для меня.

Как эффективно выкинуть правильное пользовательское исключение?

Ответы [ 4 ]

1 голос
/ 02 мая 2009

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

[OperationContract]
[FaultContract(typeof(MemberAlreadyExistsException))]
void MemberInsert(Member mu);
1 голос
/ 02 мая 2009

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

0 голосов
/ 02 мая 2009

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

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

0 голосов
/ 02 мая 2009

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

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

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