在Enterprise Library中使用异常处理块

时间:2009-01-02 22:42:48

标签: .net enterprise-library

我们有一个ASP.NET应用程序,它使用异常处理应用程序块将我们的异常记录到数据库(间接使用日志记录块)。这一切都很完美。但是,由于它使用异常处理块来记录数据,因此每次我们想要记录时,我们都必须新建一个System.Exception对象。由于我们没有抛出异常,因此没有性能问题。但是,每次我们要记录某些内容时,我们都必须创建一个新的异常对象。这是一个糟糕的设计吗?

3 个答案:

答案 0 :(得分:3)

您可以独立于异常处理策略定义日志记录策略,它们不必一起使用。

异常处理和日志记录通过链接监听器一起使用多次。例如,您可以捕获catch块中的特定错误并引用您的异常处理策略,该策略还可以包括通过logCategory记录操作。

另一方面,要仅执行某些事件/操作的日志记录,只需指定未从异常处理策略引用的日志跟踪侦听器。使用Trace.Write语句输出日志消息。

无论如何,如果您创建不同的策略,您可以在需要时链接侦听器以获得更大的灵活性。

<强>更新 在loggingConfiguration部分中,配置另一个Trace Listener。然后,您需要在web.config的categorySources部分下添加侦听器。下面显示的是记录两个源,即事件日志和xml文件。

<categorySources>       
<add switchValue="All" name="Database Events">
    <listeners>
        <add name="Formatted EventLog TraceListener"/>
        <add name="XML TraceListener"/>
    </listeners>
</add></categorySources>

在您的例外处理部分下,确保将“数据库事件”类别来源连接到您的政策:(为了便于阅读,省略了一些细节)

<exceptionHandling>
<exceptionPolicies>
    <add name="Data Access Policy">
            <exceptionTypes>
                <add type="System.OverflowException, mscorlib, ... postHandlingAction="NotifyRethrow" name="OverflowException">
                    <exceptionHandlers>
                        <add logCategory="Database Events" eventId="100" ... severity="Critical" name="Logging Handler"/>
                        <add exceptionMessage="Overflow Exception caught." ... >
                    </exceptionHandlers>
                </add>
            </exceptionTypes>
    </add>  
</exceptionPolicies></exceptionHandling>

因此,在这种情况下的最终结果是链接两个从单个策略引用的侦听器。请注意,它是从system.overflow异常类型处理的 - 只是一个示例,说明如何为不同的异常指定不同的处理程序。

当然,您只需添加日志文件侦听器,并在需要记录事件/操作时从代码中调用它,而不必依赖异常处理。如果您想了解更多细节,请告诉我。

答案 1 :(得分:0)

我不会这么说。它是一个异常处理块,而不是一个日志块。也许您应该使用EL的LAB?

顺便说一下,我喜欢并使用ELMAH作为异常处理块。它也不是专为日志记录而设计的,只是为了处理异常并将其记录下来以供日后检查。我认为有一种方法可以在不增加异常对象的情况下引发异常事件。

答案 2 :(得分:0)

由于您已经在使用日志应用程序块和EL(即使它是间接的),您应该只能通过它登录数据库,而不是仅为了记录目的而新建一个例外。

我也非常喜欢ELMAH进行异常处理。我将其用于未处理的异常日志记录,将log4net用于所有其他日志记录。