【问题标题】:C# Contract Implementations and ExceptionsC# 合同实现和异常
【发布时间】:2009-05-02 00:13:04
【问题描述】:

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

  1. 在数据库中插入一条记录
  2. 发送包含记录元数据的电子邮件通知

两者都是通过调用负责完成操作的各个 DAO 方法来处理的。

我不会在我的 DAO 中捕获异常,而是在 BO 中处理和发布它们。第一次调用是对 DAO 进行插入,并且可以抛出 NullReferenceException 或其中一个 sql 异常。 email 方法使用 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,它被 AddSupportTicket 中的另一个 try catch 捕获,然后在 UI 中重定向到一个智能错误,所以这对我来说听起来不太好。

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

【问题讨论】:

  • 我会重新考虑您为什么认为您需要自定义例外。您认为您可以在其中提供哪些额外信息?
  • 我认为这是一种很好的行为——有时。您限制 layer 的 api 以使其更易于使用并允许调用者处理更多逻辑错误。
  • 我同意 Preet 的观点。我发现使用合同履行的例外来实现 API/LOB 层要干净得多。我发现管理返回的错误代码不是业务方法的整体值很奇怪,有时甚至很困难。

标签: c# exception business-logic


【解决方案1】:

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

【讨论】:

  • 我喜欢企业库的方法,但一直推迟将其用于异常情况,以便我可以专注于让其他事情发生。但总体而言,这是一个很棒的方法,+1
【解决方案2】:

如果您使用 WCF,您可以指定可以从给定函数中引发的异常类型,因此在您的服务接口中,您将拥有类似

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

【讨论】:

  • 我喜欢这个,但我的层是引用的程序集,而不是服务。不过,我确实喜欢多个负载平衡网络盒的方法。 +1
【解决方案3】:

不知道某个属性,但你可以不只是这样做:

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

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

【讨论】:

    【解决方案4】:

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

    您最好的选择是在应用程序的各个级别进行适当的文档和智能异常处理,就像这听起来一样 glib。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多