如何重构C#中的日志记录?

时间:2010-03-08 20:02:18

标签: c# .net logging refactoring

在我的服务中,所有公开的方法都有:

try
{
    // the method core is written here
}
catch(Exception ex)
{
    Log.Append(ex);
}

一遍又一遍地重复它是无聊和丑陋的。有什么办法可以避免吗?是否有更好的方法来保持服​​务正常工作,即使发生异常并继续将异常详细信息发送到Log类?

9 个答案:

答案 0 :(得分:5)

试试AOP。这是AOP最广泛使用的卖点。

此外,请参阅此处的this discussion

答案 1 :(得分:4)

我现在想出了一个半解决方案。我可以重构代码:

public TResult ExecuteAndLogOnError(Func<TResult> func)
{
    try
    {
        return func();
    }
    catch(Exception ex)
    {
       // logging ...
    }
}

然后你可以在每种方法上调用它:

return ExecuteAndLogOnError(() =>
{
    // method core goes here..
});

比原始场景短4行。

答案 2 :(得分:4)

您可以为所有未捕获的异常设置一般错误处理方法,如下所示:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException);

根据出现的问题,您可能无法从错误中恢复...但是这应该会让您知道出了什么问题。如果它到达了应用程序代码未正常处理异常的程度,则此方法可能会尝试将服务重新初始化为已知的工作状态。

答案 3 :(得分:3)

在这种情况下,我总是使用集中式错误处理程序。 在WCF中,它非常简单。更多细节: http://www.haveyougotwoods.com/archive/2009/06/24/creating-a-global-error-handler-in-wcf.aspx

基本上,您只需实现IServiceBehavior接口,然后提供自己的错误处理程序。这是执行此操作的最佳方法,因为您不必在方法中编写任何处理致命异常的代码(我的意思是您只能记录异常,而您不知道该怎么做)。

答案 4 :(得分:2)

如果你所做的都是记录,那么只需在稍后阶段记录错误......不需要提前记录错误。如果你做的不仅仅是记录错误,那么你还是需要try..catch。如果你吞下异常(IE。只是记录它们,然后就好像没有发生那样继续),那么也许你做错了......

答案 5 :(得分:1)

我曾经使用类似模板功能模式的东西来解决这样的问题。我有一个基类,它做了类似的事情:

public void Execute()
{
    try
    {
        ExecuteImplementation();
    }
    catch (Exception ex)
    {
        // Log ex
    }
}

public abstract void ExecuteImplementation();

每个Web服务操作有一个派生类。派生类每个都实现了ExecuteImplementation。

网络服务运营确实:

[WebMethod]
public Result WebOperation(Request request)
{
    WebOperationClass instance = new WebOperationClass(request);
    instance.Execute();
    return instance.Result;
}

答案 6 :(得分:1)

异常过滤器对此有好处。唉,.NET通过MSIL,C ++ / CLI,VB.NET支持它们,但不支持C#。

答案 7 :(得分:1)

如果您在catch中所做的只是记录异常,那么您可以使用自定义错误页面并让ELMAH记录所有未捕获的异常。

答案 8 :(得分:0)

之前的海报提出了AOP(Aspecte-Oriented Programming)。

我使用PostSharp进行基本的日志记录跟踪/异常。

使用和设置非常简单。

查看此链接并观看教程。

http://www.sharpcrafters.com/postsharp

- 废话它不再是开源......无论如何你可以抓住Postsharp1.5并乱用它看看它是否是你感兴趣的东西。

我也与PostSharp无关。我只是一个用户。