【发布时间】:2009-05-02 00:13:04
【问题描述】:
我有一个 BO 方法,它必须执行两个操作才能履行其合同。
- 在数据库中插入一条记录
- 发送包含记录元数据的电子邮件通知
两者都是通过调用负责完成操作的各个 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