代码之家  ›  专栏  ›  技术社区  ›  Jeff LaFay

在MVVM中,我在哪里捕获异常?

  •  29
  • Jeff LaFay  · 技术社区  · 14 年前

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

    让我们使用endpoint not found作为一个例子,考虑到这是一个异常,我想提请用户注意。考虑一下粗略的代码示例:

    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 回复  |  直到 14 年前
        1
  •  34
  •   Community datashaman    7 年前

    我一直在处理MVVM客户机中的异常,方法是捕获它们并将它们包装成 ErrorViewModel 任何东西的属性 ViewModel 捕捉到异常。

    假设一个ViewModel 一个 捕获EndpointNotFoundException。要显示此错误,我将异常包装在ErrorViewModel中,并将其分配给 一个 的错误属性。

    与关联的视图 一个 包含 ContentControl 绑定到 一个 的错误属性。同时,我用 DataTemplate 将错误视图与ErrorViewModel关联。从这个角度来看, Visibility 是由是否 一个 的错误属性包含异常。

    所以 一个 的视图包含一个错误消息视图,该视图仅在捕获到异常时才会出现,并且用户可以取消该视图(错误消息视图上的“确定”按钮调用 一个 那就清楚了 一个 的错误属性,从而将错误消息视图的可见性更改为 Collapsed ).

    到目前为止,这似乎是一个很好的方法,可以保持适当的MVVM分离。

    希望能有所帮助。不管怎样,老实说,我会考虑 System.Windows.MessageBox.Show() 在一个WPF应用程序中纯粹是最后的手段。为什么要放弃对UI的丰富控制,而选择那个老东西呢?说到这里 another popup-implementation approach .