C#合同实现和例外

时间:2009-05-02 00:13:04

标签: c# exception business-logic

我有一个BO方法,必须完成两个操作才能履行合同。

  1. 将记录插入db
  2. 发送包含记录元数据的电子邮件通知
  3. 两者都通过调用负责完成操作的各个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被另一个尝试catch在AddSupportTicket中捕获,然后在UI中重定向到一个一个聪明的错误,这对我来说听起来不太好。

    我应该如何有效地抛出正确的自定义异常?

4 个答案:

答案 0 :(得分:1)

是的,这很有可能。查看企业库exception handling block。很多关于提升,包装,记录层之间和层之间的异常以及设置策略的好东西,以便您可以在配置中处理它。结合日志应用程序块,它是一个强大的组合。

答案 1 :(得分:1)

如果你使用WCF,你可以指定从给定的函数抛出什么类型的异常,所以在你的服务界面中你会有类似的东西

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

答案 2 :(得分:0)

不知道属性,但你不能这样做:

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

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

答案 3 :(得分:0)

C#不提供类似Java的throws关键字的功能,如果这是您所指的。您可以通过XML文档标准记录我的代码抛出的各种异常,但没有办法合同强制执行此操作。

您最好的选择是在应用程序的所有级别上进行适当的文档处理和智能异常处理,就像听起来那样轻浮。