2010-11-19 45 views
23

我的视图模型类有一个连接到服务的方法(不确定这是否是好的做法,或者视图模型应该是严格的属性和属性更改机制)。当然,我想在连接或断开连接时处理任何可能的WCF异常。我在哪里可以捕获MVVM中的异常?

考虑到这是我想引起用户注意的一个例外,我们使用未找到的端点作为示例。考虑粗糙的代码示例:

public void Connect() 
{ 
    ServiceClient proxy = null; 
    try 
    { 
     proxy = new ServiceClient(); 
     proxy.Subscribe(); 
     // ... 
    } 
    catch(EndpointNotFoundException) 
    { 
     // should I do something here? 
    } 
    // .. other WCF related exception catches and a finally 
} 

是它认为好的做法渔获内可能调用System.Windows.MessageBox.Show()直接或者我应该可能重新抛出异常,所以我的WPF应用程序的另一层抓住它?如果是这样,哪里才是理想的地方来捕捉这样的例外?

+0

用户对此异常的意图究竟是什么?你应该告诉用户他需要什么才能正确“处理”这个异常。如果用户没有办法做到这一点,那么不要告诉用户任何异常情况,可能是“对不起,但有些事情是错误的”。 – 2010-11-19 19:49:50

+1

@约翰,用户不需要拯救世界。我只需要向用户展示远端不可用。这就是为什么我提到一个MessageBox。这个问题不是关于我应该告诉用户的,我想知道如何在我使用的模式中优雅地处理异常。 – jlafay 2010-11-19 19:59:21

+0

我以这种方式处理WCF错误:[MSDN](http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx) – Gabe 2010-11-19 19:13:09

回答

27

我一直在处理我的MVVM客户端中的异常,通过捕获它们并将它们包装在ErrorViewModel属性中,无论ViewModel是什么引发异常。

让我们假设一个ViewModel A捕获EndpointNotFoundException。为了显示这个错误,我将Exception包装在一个ErrorViewModel中,并将其分配给A的Error属性。

一个相关视图包含势必一个的错误属性ContentControl。同时,我使用DataTemplate将错误视图关联到ErrorViewModel。在该视图中,VisibilityA的Error属性是否包含异常来决定。

所以一个的视图包含错误消息认为只会出现一个异常被捕获时,并可以由用户被解雇(在错误消息的OK按钮查看关于A调用命令清除A的错误属性,从而将错误消息视图的可见性更改为Collapsed)。

到目前为止,这似乎是一种保留适当的MVVM解耦的好方法。

希望有所帮助。不管怎样,老实说,我认为WPF应用中的System.Windows.MessageBox.Show()纯粹是最后的手段。为什么放弃对UI的丰富控制以支持那件旧事?说到这,这里的another popup-implementation approach

+0

我想到一个MessageBox将是最后的手段(并暗中希望如此)。 – jlafay 2010-11-19 19:43:43

+2

我喜欢这种方法; ViewModel的工作代表了一个可视化的状态。因此,模型中某处出现的错误绝不应该被“推送”到视图中;相反,ViewModel的状态应该反映出有错误。我还可以看到将错误传播到某个ErrorDisplayService,并具有集中的机制来公开各种来源的错误状态。 – 2010-11-19 19:47:16

+0

我非常喜欢这个。如果我了解你,你会将任何意味着“我无法到达另一端”的异常抽象为一些错误,以便显示给用户。那很完美。如果这是一个API,我会建议在另一个包装这样的例外,说:“不能达到另一端”。 – 2010-11-19 20:03:45

相关问题