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

C# WCF N-Tier应用程序中的异常处理和日志记录,c#,wcf,logging,exception-handling,n-tier-architecture,C#,Wcf,Logging,Exception Handling,N Tier Architecture,我们的应用程序的布局如下所示 WCF-业务层类库dll-数据访问层类库dll-SQL Server 通常,类库不访问数据库以外的外部资源 WCF层为报告提供数据 看到了一些关于异常应该在上层处理的指导之后,我想这意味着我可以简单地让类库抛出异常,因此我不需要在类库中使用任何try-catch语句 我觉得不需要捕捉异常并在库中记录特定信息,也不需要计划在应用程序/客户端代码中捕捉异常,在本例中,这是WCF层。 在这个级别,我计划记录异常/堆栈跟踪,并显示一个用户友好的异常 我觉得在WCF级别记录

我们的应用程序的布局如下所示

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

通常,类库不访问数据库以外的外部资源

WCF层为报告提供数据

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

我觉得不需要捕捉异常并在库中记录特定信息,也不需要计划在应用程序/客户端代码中捕捉异常,在本例中,这是WCF层。

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

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

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

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

。我建议你看看

除非你完全可以做某事,否则你可能会捕捉到任何异常,这样你就可以尝试其他方法来避免它。如果您无法避免它,那么让我们期待
finally
块取得最佳效果。否则,IMHO,最好让异常冒泡并在那里处理它,因为你“不知道”什么会真正消耗你的服务,所以我认为你的服务应该让任何异常冒泡并让最终用户决定如何处理它,因为每个人都不会这样处理

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

if (someUncoverableCondition)
    throw new SomeSpecificException();
而不是试图捕捉每一个可能的异常

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

下面是进一步的阅读


(可能没有直接关系,但无论如何还是很高兴知道)

实现这一点的一种方法是实现一个定制,可能作为一个行为扩展元素,您可以通过声明的方式添加到配置中

在执行
providDefault
方法时,您可以:

  • 日志异常

  • (可选)为客户端生成错误


+1异常处理可能很棘手。当有疑问时,最好问!=)如果你的中间部分读到
if(someUnrecoverableCondition)抛出新的somespecificeexception()
Will,那么它会更准确,感谢你的快速和有用的响应-一开始会采取最简单的方法,并将所有内容冒泡出来,除非这样做有意义。谢谢Robert,你的建议很有意义。我编辑过。=)我很高兴能帮上忙,利亚姆!=)感谢您接受并投票支持我的答案!=)