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

Jef*_*Fay 30 wpf exception-handling mvvm

我的视图模型类有一个连接到服务的方法(不确定这是好的做法,还是视图模型应该是严格的属性和属性更改机制).当然,我想在连接或断开连接时处理任何可能的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
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*n J 34

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

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

A关联的视图包含ContentControl绑定到A的Error属性.同时,我使用a DataTemplate将Error View与ErrorViewModel相关联.在该视图中,VisibilityA的Error属性是否包含异常确定.

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

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

希望有所帮助.不管怎样,老实说,我认为System.Windows.MessageBox.Show()在WPF应用程序中纯粹是最后的手段.为什么放弃对UI的丰富控制以支持旧的东西?说到这里,这是另一种弹出式实现方法.

  • 我喜欢这种方法; ViewModel的工作是表示可以可视化的状态.因此,模型中某处发生的错误永远不应该被"推送"到View; 相反,ViewModel的状态应该反映出有错误.我还可以看到将错误传播到某些ErrorDisplayService,并使用集中式机制从各种来源公开错误状态. (2认同)