C# 调用WCF回调方法时正确的异常处理
我有一系列WCF服务,它们根据服务器端的事件再次调用客户端上的方法(使用WCFDuplexChannel)。然而,似乎有相当多的异常可能会发生,所以现在我有一个巨大的try/catch块围绕每一行调用回客户端,以在任何异常发生时禁用事件结束。除了每次编写都很麻烦之外,我不确定是否可以通过捕获几个基本异常来简化try-catch块?现在我真的不关心是什么导致了异常(我不关心它是否出错、中止、处理或超时),但我会记录不同的异常 我也读过关于IErrorHandler的内容,但在客户端调用方法时,这是否真的合适? 以下是我当前策略的一个示例:C# 调用WCF回调方法时正确的异常处理,c#,wcf,exception-handling,C#,Wcf,Exception Handling,我有一系列WCF服务,它们根据服务器端的事件再次调用客户端上的方法(使用WCFDuplexChannel)。然而,似乎有相当多的异常可能会发生,所以现在我有一个巨大的try/catch块围绕每一行调用回客户端,以在任何异常发生时禁用事件结束。除了每次编写都很麻烦之外,我不确定是否可以通过捕获几个基本异常来简化try-catch块?现在我真的不关心是什么导致了异常(我不关心它是否出错、中止、处理或超时),但我会记录不同的异常 我也读过关于IErrorHandler的内容,但在客户端调用方法时,这是
private void OnProductChanged(List<DTO> products)
{
try
{
client.OnProductChanged(products);
return;
}
catch (TimeoutException)
{
log.Info("Communication to client timed out.");
}
catch (CommunicationObjectAbortedException)
{
log.Info("Connection to client is in aborted state.");
}
catch (CommunicationObjectFaultedException)
{
log.Info("Connection to client is in faulted state.");
}
catch (CommunicationException ce)
{
log.InfoFormat("CommunicationException occured on product change notification: {0}.", ce.Message);
}
catch (ObjectDisposedException)
{
log.Info("Communication channel is disposed.");
}
catch (Exception e)
{
log.WarnFormat("Unhandled {0} on client callback: {1}", e.GetType(), e.Message);
}
SendProductChanged = false;
}
private void OnProductChanged(列出产品)
{
尝试
{
客户。OnProductChanged(产品);
返回;
}
捕获(超时异常)
{
log.Info(“与客户端的通信超时”);
}
捕获(通信对象中止异常)
{
log.Info(“与客户端的连接处于中止状态”);
}
捕获(通信对象故障异常)
{
log.Info(“与客户端的连接处于故障状态”);
}
捕获(通信异常ce)
{
log.InfoFormat(“在产品更改通知上发生通讯异常:{0}.”,ce.Message);
}
捕获(ObjectDisposedException)
{
log.Info(“通信信道被处理”);
}
捕获(例外e)
{
WarnFormat(“客户端回调上未处理的{0}:{1}”,e.GetType(),e.Message);
}
SendProductChanged=false;
}
SendProductChanged=false代码>行将负责解除事件处理程序的绑定。您可以编写一个包装器方法,将Funcs的操作作为参数,并且可以在此函数内使用try-catch块。您可以使用此函数调用您的函数;比如:
public void CallMethod(Action methodToBeCalled)
{
try
{
methodToBeCalled();
}
catch
.....
....
}
然后调用如下函数:
CallMethod(() => client.OnProductChanged(products));
我突然想到了这一点。我特别感兴趣的是,如果有人会对我问题的第二部分做出反应,否则我认为你的答案可能是最好的。谢谢几年后,我回顾这个问题,这正是我现在的做法。捕获发生了一些变化,并且我的服务已更改为单实例,因此,如果出现某些异常类型,则会将客户端从客户端列表中删除。