如何在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);