2012-03-28 111 views
0

我有一系列的WCF服务,它们根据服务器端的事件再次调用客户端上的方法(使用WcfDuplexChannels)。但是,似乎有一些可能会发生的异常,所以现在我在每一行回调客户端都有一个巨大的try/catch块,最后在发生任何异常时禁用该事件。除了繁琐的写每一次,我不确定是否可以通过捕获几个基本例外来简化try catch块?现在我并不在意是什么导致异常(我不在乎它是故障,中止,处理还是超时),但是我记录了不同的异常。调用WCF回调方法时的正确异常处理

我也读过关于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;线将解除绑定事件处理程序的照顾。

回答

1

您可以编写一个包含Funcs Actions作为参数的包装方法,并且您可以在此函数中使用try catch块。你可以使用这个函数调用你的函数;是这样的:

public void CallMethod(Action methodToBeCalled) 
{ 
    try 
    { 
     methodToBeCalled(); 
    } 
    catch 
    ..... 
    .... 
} 

然后打电话给你的功能,如:

CallMethod(() => client.OnProductChanged(products)); 
+0

这已经跨越了我的脑海里。我特别感兴趣的是,如果有人会对我的问题的IErrorHandler部分做出反应,否则我认为您的答案可能会达到最佳效果。谢谢! – mycroes 2012-03-28 11:57:25

+0

多年后,我回头看这个问题,这正是我现在这样做的方式。捕获已经发生了一些变化,我的服务已经更改为单实例,所以如果发生某些异常类型,客户端将从客户端列表中删除。 – mycroes 2017-09-15 12:10:10