2010-11-19 3 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() непосредственно в улове или я должен возможно Rethrow исключение, чтобы другой слой моего приложения WPF ловит ? Если да, то где это идеальное место, чтобы поймать такое исключение?

+0

Что именно пользователь должен делать с этим исключением? Вы должны сообщить пользователю все, что ему нужно, чтобы правильно «обработать» это исключение. Если пользователь ничего не может с этим поделать, тогда не говорите пользователю ничего исключающего, может быть, «Извините, но что-то не так». –

+1

@John, пользователю не нужно спасать мир. Мне просто нужно представить пользователю, что удаленный конец недоступен. Вот почему я упоминаю MessageBox. Этот вопрос не касается того, что я должен сказать пользователю, я хочу знать, как элегантно разбираться с исключениями в шаблоне, который я использую. – jlafay

+0

Я обрабатываю ошибки WCF таким образом: [MSDN] (http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx) – Gabe

ответ

27

Я обрабатывал исключения в своем MVVM-клиенте, улавливая их и обматывая их в свойстве ErrorViewModel того, что ViewModel поймал исключение.

Предположим, что ViewModel A ловит EndpointNotFoundException. Чтобы представить эту ошибку, я завершаю Exception в ErrorViewModel и присваиваю это значение A Ошибка свойства.

The View, связанный с содержит ContentControl, связанные с собственностью Error «s. Между тем, я использую DataTemplate, чтобы связать представление ошибки с ErrorViewModel. В этом представлении Visibility определяется значением . Свойство Ошибка содержит исключение.

Так Посмотреть «s содержит ошибки просмотра сообщения, которое будет отображаться только тогда, когда исключение ловится, и может быть отклонено пользователем (кнопка OK на сообщения об ошибке View вызывает команду на A, который очищает свойство ошибки A, тем самым изменяя видимость сообщения об ошибке на Collapsed).

До сих пор это, по-видимому, хороший подход, который сохраняет надлежащую развязку MVVM.

Надеюсь, что это поможет. Так или иначе, честно говоря, я бы рассмотрел System.Windows.MessageBox.Show() в приложении WPF как чисто последнее средство. Зачем отказываться от богатого контроля над пользовательским интерфейсом в пользу этой старой вещи? Кстати, вот another popup-implementation approach.

+0

Я решил, что MessageBox будет в последнюю очередь (и втайне надеялся). – jlafay

+2

Мне нравится этот подход; задача ViewModel - представлять состояние, которое можно визуализировать. Таким образом, ошибка, которая произошла где-то в модели, никогда не должна «подталкиваться» к представлению; скорее, состояние ViewModel должно отражать, что произошла ошибка. Я также мог видеть распространение ошибки до некоторого ErrorDisplayService с централизованным механизмом для отображения состояний ошибок из разных источников. –

+0

Мне это очень нравится. Если я вас понимаю, вы бы отбросили любое исключение, которое означает «Я не могу достигнуть другого конца», в некоторую ошибку, которая будет отображаться пользователю. Отлично. Если бы это был API, я бы предложил обернуть такие исключения в другой, который гласит: «Невозможно достичь другого конца». –

Смежные вопросы