Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中重构日志记录?_C#_.net_Logging_Refactoring - Fatal编程技术网

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

如何在C#中重构日志记录?,c#,.net,logging,refactoring,C#,.net,Logging,Refactoring,在“我的服务”中,所有公开的方法都有: try { // the method core is written here } catch(Exception ex) { Log.Append(ex); } 一遍又一遍地重复,既无聊又难看。有什么办法可以避免吗?是否有更好的方法使服务即使发生异常也能正常工作,并将异常详细信息发送到日志类?试试。这是AOP最广泛使用的卖点 另外,请参见此处。我曾经使用类似于模板函数模式的方法来解决这样的问题。我有一个基类,它做了如下工作: publ

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

try
{
    // the method core is written here
}
catch(Exception ex)
{
    Log.Append(ex);
}
一遍又一遍地重复,既无聊又难看。有什么办法可以避免吗?是否有更好的方法使服务即使发生异常也能正常工作,并将异常详细信息发送到
日志
类?

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


另外,请参见此处。

我曾经使用类似于模板函数模式的方法来解决这样的问题。我有一个基类,它做了如下工作:

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

public abstract void ExecuteImplementation();
每个web服务操作有一个派生类。每个派生类都实现了ExecuteImplementation

web服务操作执行了以下操作:

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

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

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

这比原始场景短4行。

如果您所做的只是记录,那么只需在稍后阶段记录错误。。。无需提前记录错误。如果你做的不仅仅是记录错误,那么你无论如何都需要尝试。如果你接受了异常(即只记录它们,然后像什么都没发生一样继续),那么可能你做错了

在这种情况下,我总是使用集中式错误处理程序。 在WCF中,这是非常容易的。更多详情:


基本上,您只需实现IServiceBehavior接口,然后提供自己的错误处理程序。这是最好的方法,因为您不必编写任何代码来处理方法中的致命异常(我指的是您只能记录的异常,您不知道如何处理它们)。

异常过滤器对此很有用。唉,.NET通过MSIL、C++/CLI、VB.NET而不是C#支持它们。

如果您在捕获过程中所做的只是记录异常,您可以使用自定义错误页,让它记录所有未捕获的异常。

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

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

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

以前的海报中提到了AOP(面向Aspecte的编程)

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

它很容易使用和设置

查看此链接并观看教程

--废话,它不再是开源的。。。不管怎样,你可以抓取Postsharp1.5,把它弄得乱七八糟,看看它是否是你感兴趣的东西


我也与PostSharp没有任何关系。我只是一个用户

等等,你在博客文章中提到的例子没有删除
try-catch
。它只重构
Log.Append
行,对吗?使用面向方面编程,您的处理方式不同。请看PostSharp的简介,了解一个想法——这样您就不用try/catch等来记录日志,而是使用一个属性。显然,您仍然需要try/finally进行代码清理等。顺便说一句,postsharp链接就是一个例子-我不是说这是您需要的解决方案。您指的是什么样的服务?WCF、asmx、windows服务?您的解决方案激发了我自己的灵感,我将其作为答案发布在这里。它很可能会导致不必要的关闭。这个问题比您最初的问题更难;)@empi我读过它,但我无法想象上面的代码会导致问题的场景。首先,您必须记住以这种方式执行方法(与闭包无关)。现在对于闭包,部分闭包可能很难理解。在使用闭包时,您必须了解变量生存期。这也可能导致一些你不必预料的怪癖,例如。我想说的是,你增加了复杂性,在我看来这是不必要的。我在这个项目中不使用ASP.NET或IIS,实际上有很多。另一个例子是对基类以外的方法的非虚拟调用。值类型的无参数构造函数。通用协方差在运行时是可用的,在C#接受它之前,它是一个主要版本(实际上我猜C#支持仍在测试阶段)。
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException);