在我的服务中,所有公开的方法都有:
try
{
// the method core is written here
}
catch(Exception ex)
{
Log.Append(ex);
}
一遍又一遍地重复它是无聊和丑陋的。有什么办法可以避免吗?是否有更好的方法来保持服务正常工作,即使发生异常并继续将异常详细信息发送到Log
类?
答案 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无关。我只是一个用户。