调用WCF回调方法时的正确异常处理
本文关键字:异常处理 WCF 回调 方法 调用 | 更新日期: 2023-09-27 18:29:11
我有一系列WCF服务,它们根据服务器端的事件再次调用客户端上的方法(使用WcfDuplexChannels)。然而,似乎也会发生一些异常,所以现在我在每一条回叫客户端的行周围都有一个巨大的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;
}
SendProductChanged = false;
行将负责解除事件处理程序的绑定。
您可以编写一个包装器方法,该方法以函数的Actions为参数,并且可以在该函数中使用try-catch块。您可以使用此函数调用您的函数;类似于:
public void CallMethod(Action methodToBeCalled)
{
try
{
methodToBeCalled();
}
catch
.....
....
}
然后调用您的函数,如:
CallMethod(() => client.OnProductChanged(products));