我有一个WCF SVC分为服务层,业务逻辑层和数据访问层。

当我的DAL遇到异常时,我应该在那里捕获或让它冒出来回到服务层吗?为什么?

请忽略对这种情况的任何客户参与,我只关心记录WCF SVC上的异常。

有帮助吗?

解决方案

这也取决于您如何构建解决方案。例如,如果DAL和BLL层是完全独立的组件,那么他们就无法对谁打电话做出假设。因此,他们都应在组件边界上捕获异常,记录这些异常,然后允许异常传播。他们可能想在特定层的异常中包裹一般例外:

catch (Exception ex)
{
    Logger.Log(ex);
    throw new DalException("Unhandled exception in DAL", ex);
}

如果你 知道 这些只能用作整体应用程序的一部分,然后您可以将记录推迟到最外层 - 如果没有捕获异常,则不会记录异常。

其他提示

有一个术语 - 例外屏蔽。基本上,您应该防止系统异常进入更高级别,因为这可能会使Atacker欣赏您的系统体系结构。 WCF异常屏蔽可以捕获某些类型的例外,并用其他类型的例外替换它们。例如,它可以捕获Stackoverflow异常,并将其替换为自定义SystemException。如果您使用企业库,您也可以在替换时配置这些异常

使用企业库中的异常处理块3.0

我想这取决于如何消耗服务以及您想知道的人(如果有人)在发生异常时要知道谁。

例如,如果您正在开发关键任务的内部业务应用程序,则可能希望通过服务层泡泡到使用该应用程序的用户界面,以便他们最终用户可以与开发人员联系以快速,以便通过服务层泡泡到用户界面。解决问题。

但是,假设您的服务被公共网页消费。您可能仍然希望服务层以某种方式捕获错误,但是您可能会选择将最小信息传递给最终客户端,向最终用户提供通用错误消息,并将异常的详细信息写入错误日志开发人员要审查。

最后,我仍然认为您希望异常能够冒出服务层,但是如何处理异常并确定将哪些信息传递给最终客户端取决于您。

我通常使用通用错误处理程序(System.ServiceModel.Dispatcher.IErrorHandler 实现)由配置文件中的ServiceBehavior连接到Web服务。

IErrorHandler.ProvideFault 方法拦截了从服务中抛出的例外,

  • 记录他们;

  • 通过AS-IS传递FARSEXCEPTASS;

  • 将BLL抛出的“业务”异常(例如违反业务规则违规)使用故障代码“发送者/客户端”转换为FARSEXPESTIONS;

  • 将技术异常(例如DAL投掷)转换为使用故障代码“接收器/服务器”的FARSEXCEPTIONS。

这样,服务代码本身仅包含业务代码,而无需捕获任何例外。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top