WCF N-Tier应用程序中的异常处理和日志记录

时间:2012-11-23 17:35:25

标签: c# wcf logging exception-handling n-tier-architecture

我们的应用程序布局如下

WCF - 业务层类库dll - 数据访问层类库dll - SQL Server。

通常,类库不访问DB以外的外部资源。

WCF层为报告提供数据。

已经看到一些指导,应该在上层处理异常,我想这意味着我可以简单地让类库抛出异常,所以我不需要在类库中任何try catch语句! / p>

我觉得不需要捕获异常并记录库中的特定信息,并计划捕获app / client代码中的异常,在这种情况下是WCF层。 WCF Exception Handling Strategies

在此级别,我计划记录异常/堆栈跟踪并提供用户友好的异常。

我觉得在WCF级别记录堆栈跟踪会给我足够的信息来确定 问题的原因和。

这是一个好的方法还是我错过了什么

我希望保持简单,避免不必要的尝试捕获并仅在一个位置处理异常/日志。

2 个答案:

答案 0 :(得分:4)

Eric Lippert has written a good article on Exception Handling。我建议你看看。

除非您绝对可以做某事,否则您可能会遇到任何异常,以便您可以尝试其他方法来避免它。如果你无法避免它,那么让我们希望finally块最好。否则,恕我直言,最好让异常泡泡并在那里处理它,因为你“不知道”什么会真正消耗你的服务,所以我认为你的服务应该让任何异常冒出来让最终用户决定如何处理它,因为每个人都不会处理这些。

同样,从Eric Lippert的博客中我现在找不到网址,最好编写如下代码:

if (someUncoverableCondition)
    throw new SomeSpecificException();

而不是试图抓住每一个可能的例外。

最后,处理您可以使用的内容以及您知道如何处理的内容,并让其他异常发生。也许过了一段时间,您将知道如何以有效的方式处理这些异常,以便您可以重构代码。同时,如果你觉得让他们通过也许会更好,那在你的情况下这一定是正确的。

这是进一步的阅读。

The Bad Practices of Exception Handling(也许没有直接关系,但无论如何都要好好知道)

答案 1 :(得分:3)

实现此目的的一种方法是实现自定义IErrorHandler,可能作为行为扩展元素,您可以以声明方式添加到配置中。

ProvideFault方法的实施中,您可以:

  • 记录例外

  • 可选择为客户生成故障。