【问题标题】:Exception Handling and Logging in WCF N-Tier appWCF N-Tier 应用程序中的异常处理和日志记录
【发布时间】:2012-11-12 02:02:22
【问题描述】:

我们应用的布局如下

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

类库一般不访问数据库以外的外部资源。

WCF 层为报告提供数据。

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

我觉得不需要在库中捕获异常并记录特定信息,并计划在应用程序/客户端代码中捕获异常,在这种情况下是 WCF 层。 WCF Exception Handling Strategies

在这个级别,我计划记录异常/堆栈跟踪并呈现一个用户友好的异常。

我觉得在 WCF 级别记录堆栈跟踪将为我提供足够的信息来确定 问题的原因以及。

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

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

【问题讨论】:

  • +1 异常处理可能很棘手。如有疑问,最好问! =)

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


【解决方案1】:

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

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

再次,从我现在找不到 URL 的 Eric Lippert 的博客中,最好编写如下代码:

if (someUncoverableCondition)
    throw new SomeSpecificException();

而不是试图捕获所有可能的异常。

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

这里是进一步阅读。

The Bad Practices of Exception Handling(也许没有直接关系,但很高兴知道)

【讨论】:

  • 如果你的中间部分是if (someUnrecoverableCondition) throw new SomeSpecificException()
  • 威尔,感谢您的快速和乐于助人的回复 - 最初会采用最简单的方法并冒泡所有内容,除非不这样做是有意义的。
  • 谢谢罗伯特,你的建议很有道理。我已经编辑过了。 =)
  • 我很高兴能帮上忙,利亚姆! =) 感谢您接受并支持我的回答! =)
【解决方案2】:

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

ProvideFault方法的实现中你可以:

  • 日志异常

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多