如何处理ViewModel中的属性出现时发生的异常?该属性在Loaded事件之前发生。例如,我有一个属性(get-only),它调用一些数据方法来返回状态集合以填充组合框的itemsource。但有时SQL不会连接,我得到一个例外。有这样的多个属性,我想告诉用户无法正确加载组合,然后将它们放回我的主屏幕。但是,如果它们全部失败,我不想要5个消息框。此外,为什么它继续尝试获取属性,即使我告诉它在第一个异常发生时进入主屏幕?注意:GetStatesList()方法也有try / catch并抛出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
}
答案 0 :(得分:1)
将所有五个语句连续使用1次try catch,而不是为每个语句尝试catch,所以如果发生异常,则3后面的第二个语句将不会被执行,并且不惜任何代价,你将只有1个msg的盒子,你可以也没有任何问题返回主屏幕
答案 1 :(得分:0)
这是你可以处理这个问题的一种方法..
为每个属性调用创建单独的方法..并抛出一个自定义异常以指示该特定调用出错。 无论如何,外部异常将确保如果一个失败,它就会失败..
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..
}