2010-11-19 49 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

相關問題