0

我有一个 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 中重定向到一个智能错误,所以这对我来说听起来不太好。

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

4

4 回答 4

1

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

于 2009-05-02T00:20:09.883 回答
1

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

[OperationContract]
[FaultContract(typeof(MemberAlreadyExistsException))]
void MemberInsert(Member mu);
于 2009-05-02T00:24:16.753 回答
0

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

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

  throw new MyException("Some biz msg", ex);
}
于 2009-05-02T00:17:37.970 回答
0

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

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

于 2009-05-02T00:21:05.560 回答