我在哪里可以捕获MVVM中的异常?

时间:2010-11-19 19:09:28

标签: wpf mvvm exception-handling

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

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

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
}

是否可以直接在catch中调用System.Windows.MessageBox.Show()或者我是否应该重新抛出异常,以便我的WPF应用程序的另一层捕获它?如果是这样,那么理想的地方可以捕获这样的例外吗?

1 个答案:

答案 0 :(得分:33)

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

假设ViewModel A 捕获EndpointNotFoundException。为了呈现此错误,我将Exception包装在ErrorViewModel中并将其分配给 A 的Error属性。

A 关联的视图包含绑定到 A 的错误属性的ContentControl。同时,我使用DataTemplate将错误视图与ErrorViewModel相关联。在该视图中,Visibility取决于 A 的错误属性是否包含异常。

所以 A 的视图包含一个错误消息视图,该视图仅在捕获到异常时出现,并且可以被用户解除(错误消息View上的OK按钮调用 A 上的命令清除 A 的错误属性,从而将错误消息View的可见性更改为Collapsed

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

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