Как обрабатывать исключения в свойствах модели представления MVVM?

Как я могу обработать исключение, возникающее при получении свойств в моей ViewModel? Свойство происходит до события Loaded. Например, у меня есть свойство (только для чтения), которое вызывает некоторый метод данных, чтобы вернуть набор состояний для заполнения источника элементов списка. Но иногда SQL не подключается, и я получаю исключение. Есть несколько подобных свойств, я хочу сообщить пользователю, что комбинации не могут быть загружены правильно, а затем просто вернуть их на главный экран. Однако я не хочу 5 окон сообщений, если все они не работают. Кроме того, почему он продолжает пытаться получить свойства, хотя я сказал ему перейти на главный экран, когда произошло первое исключение? Примечание: метод GetStatesList() также имеет функцию try/catch и throw в методе catch...

try
{
ObservableCollection<string> states=null;
// perform sql query
states=StateDat.Instance.GetStatesList();  //get the collection of state names
}
catch(Exception ex)
{
MessageBox.Show("Error");  //display an error message
MessengerInstance.Send(ViewModelNamesEnum.HomeVM);  //go home
}

person Theodosius Von Richthofen    schedule 21.10.2013    source источник


Ответы (2)


Имейте все пять операторов непрерывно с 1 попыткой поймать, вместо того, чтобы попытаться поймать для каждого оператора, поэтому, если произойдет исключение, 2-й оператор, следующий за 3, не будет выполнен, и любой ценой у вас будет только 1 окно сообщения, и вы можете вернуться к домашний экран тоже без проблем

person Kumareshan    schedule 21.10.2013

Вот один из способов справиться с этим.

Создайте отдельные методы для каждого вызова свойства.. и создайте собственное исключение, чтобы указать, что что-то пошло не так с этим конкретным вызовом.. В любом случае внешнее исключение гарантирует, что в случае сбоя оно выйдет из строя..

Method1() {
 try { 
     //Code for Method1 
     }catch(Exception ex) { throw new CustomException(""); }
}

Method2() {
 try { 
     //Code for Method2 
     }catch(Exception ex) { throw new CustomException(""); }
}

Method3() {
 try { 
     //Code for Method3 
     }catch(Exception ex) { throw new CustomException(""); }
}


try {
    Method1();
    Method2();
    Method3();
}catch(CustomException custom) {
 // You would know specific reasons for crashing.. and can return meaningful message to UI.
 } catch(Exception ex) { 
 //Anything that was un-handled
}


class CustomException : Exception {
 //Implementation here..
}
person Sharath    schedule 21.10.2013