神仙?妖怪?谢谢!

Just do it...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在客户端处理错误
当我们在客户端检索或修改数据时,我们通常需要处理错误和对错误做出反应。通过WCF RIA Services,我们为数据操作提供一个回调方法来处理错误,并且在回调方法里检查错误。使用回调方法是必需的,因为调用数据操作都是异步的,比且异常也是异步抛出的。默认下,对域操作中的所有错误都抛出一个异常。RIA Services为我们提供了处理错误的方式,并且可以指定框架不抛出异常。

 

当装载数据时处理错误
当从一个查询装载数据时,我们可以选择处理错误或忽略之。明确地,我们从如下选项中选择:

   1.  使用带有回调方法做为参数的Load方法。在回调方法内,处理错误,并调用MarkErrorAsHandled方法来指定不要抛出错误。

   2.  使用带一个名为thowOnError的Boolean参数的Load方法。当调用Load方法时,设置throwOnError为false来指定我们不想为查询错误抛出异常。

   3.  当Load方法没有回调参数和布尔参数时,任何查询错误都会导致一个未处理的异常。
下面的示例演示了如何从查询载入数据,并指定一个回调方法来检测装载操作中的错误。

代码
 1 private CustomerDomainContext _customerContext = new CustomerDomainContext();   
 2 public MainPage()   
 3 {   
 4     InitializeComponent();   
 5     LoadOperation<customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery(), OnLoadCompleted, null);   
 6     CustomerGrid.ItemsSource = loadOp.Entities;   
 7 }   
 8 private void OnLoadCompleted(LoadOperation<customer> lo)   
 9 {   
10     if (lo.HasError)   
11     {   
12         MessageBox.Show(string.Format("Retrieving data failed: {0}", lo.Error.Message));   
13         lo.MarkErrorAsHandled();   
14     }   
15 }

 

 

提交数据时处理错误
当提交数据时,我们不能像Load方法那样选择关闭异常。所有提交数据时发生的错误都会导致一个异常。明确地,我们可以选择如下选项:

   1.  使用带回调参数的SubmitChanges方法。在回调方法里,处理错误并调用MarkErrorAsHandled方法来指定不要抛出异常。

   2.  使用SubmitChanges方法,所有在提交数据时发生的错误都导致一个异常。

下面的示例演示了如何调用带有回调参数的 SubmitChanges方法。

代码
 1 private void SaveButton_Click(object sender, RoutedEventArgs e)   
 2 {   
 3     _customerContext.SubmitChanges(OnSubmitCompleted, null);   
 4 }   
 5 private void RejectButton_Click(object sender, RoutedEventArgs e)   
 6 {   
 7     _customerContext.RejectChanges();   
 8     CheckChanges();   
 9 }   
10 private void CustomerGrid_RowEditEnded(object sender, DataGridRowEditEndedEventArgs e)   
11 {   
12     CheckChanges();   
13 }   
14 private void CheckChanges()   
15 {   
16     EntityChangeSet changeSet = _customerContext.EntityContainer.GetChanges();   
17     ChangeText.Text = changeSet.ToString();   
18     bool hasChanges = _customerContext.HasChanges;   
19     SaveButton.IsEnabled = hasChanges;   
20     RejectButton.IsEnabled = hasChanges;   
21 }   
22 private void OnSubmitCompleted(SubmitOperation so)   
23 {   
24     if (so.HasError)   
25     {   
26         MessageBox.Show(string.Format("Submit Failed: {0}", so.Error.Message));   
27         so.MarkErrorAsHandled();   
28     }   
29     CheckChanges();   
30 }

 


调用操作时处理错误
当调用一个操作时,我们有像提交数据时一样的选择。如下:

   1.  当调用操作时包含一个回调参数。在回调参数内处理错误,并调用MarkErrorAsHandled方法来指定不要抛出异常。

   2.  调用不包含回调参数的操作。所有在调用操作时发生的错误都会抛出异常。

代码
 1 InvokeOperation<int> invokeOp = customerContext.GetLocalTemperature(selectedPostalCode, OnInvokeCompleted, null);   
 2 private void OnInvokeCompleted(InvokeOperation<int> invOp)   
 3 {   
 4   if (invOp.HasError)   
 5   {   
 6     MessageBox.Show(string.Format("Method Failed: {0}", invOp.Error.Message));   
 7     invOp.MarkErrorAsHandled();   
 8   }   
 9   else  
10   {   
11     result = invokeOp.Value;   
12   }   
13 }

 


验证服务处理错误
AuthenticationService类允许我们在调用下面的方法时提供回调参数:
   1.  LoadUser 2.Login 3.Logout 4.SaveUser
在回调方法中,我们可以提供代码来处置从验证服务中来的错误。 下面的例子演示如何从登陆按钮的事件处理中调用Login方法。

代码
 1 private void LoginButton_Click(object sender, RoutedEventArgs e)   
 2 {   
 3     LoginParameters lp = new LoginParameters(UserName.Text, Password.Password);   
 4     WebContext.Current.Authentication.Login(lp, this.LoginOperation_Completed, null);   
 5     LoginButton.IsEnabled = false;   
 6     LoginResult.Text = "";   
 7 }   
 8 private void LoginOperation_Completed(LoginOperation lo)   
 9 {   
10     if (lo.HasError)   
11     {   
12         LoginResult.Text = lo.Error.Message;   
13         LoginResult.Visibility = System.Windows.Visibility.Visible;   
14         lo.MarkErrorAsHandled();   
15     }   
16     else if (lo.LoginSuccess == false)   
17     {   
18         LoginResult.Text = "Login failed. Please check user name and password.";   
19         LoginResult.Visibility = System.Windows.Visibility.Visible;   
20     }   
21     else if (lo.LoginSuccess == true)   
22     {   
23         SetControlVisibility(true);   
24     }   
25     LoginButton.IsEnabled = true;   
26 }

 

 


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackant2/archive/2010/04/08/5461738.aspx

posted on 2010-06-05 02:31  E.Trock  阅读(985)  评论(0编辑  收藏  举报