Gestion des erreurs sur le client
Cette rubrique montre comment gérer les erreurs d'une façon générale, prendre certaines mesures face aux erreurs que vous récupérez, ou encore modifier les données d'un client. Avec les Services RIA WCF, les erreurs se gèrent en fournissant une méthode de rappel pour les opérations de données et en recherchant les erreurs dans cette méthode de rappel. L'utilisation de méthodes de rappel est nécessaire parce que les appels aux opérations de données sont asynchrones et que, par conséquent, toutes les exceptions sont levées de façon asynchrone. Par défaut, une exception est levée en cas d'erreur dans une opération de domaine. Les Services RIA vous offrent des moyens de gérer les erreurs et de spécifier que l'infrastructure ne lève pas d'exception.
Gestion des erreurs lors du chargement des données
Lorsque vous chargez des données à partir d'une méthode de requête, vous pouvez gérer l'erreur ou choisir de l'ignorer. Vous pouvez notamment choisir parmi les options suivantes :
utiliser une méthode Load ayant un paramètre pour méthode de rappel. Dans la méthode de rappel, gérez l'erreur et appelez la méthode MarkErrorAsHandled pour indiquer que l'exception n'est pas levée ;
utiliser une méthode Load ayant un paramètre boolean nommé throwOnError. Donnez à throwOnError la valeur false lorsque vous appelez la méthode Load pour indiquer que vous ne voulez pas que des exceptions soient levées pour des erreurs de requête ;
utiliser la méthode Load n'ayant pas de paramètre pour méthode de rappel ou de paramètre boolean. Les erreurs survenant à l'exécution de la requête provoqueront des exceptions non gérées.
L'exemple suivant montre comment charger des données à partir d'une requête et spécifier une méthode de rappel qui recherche des erreurs dans l'opération de chargement.
Private _customerContext As New CustomerDomainContext
Public Sub New()
InitializeComponent()
Dim loadOp = Me._customerContext.Load(Me._customerContext.GetCustomersQuery(), AddressOf OnLoadCompleted, Nothing)
CustomerGrid.ItemsSource = loadOp.Entities
End Sub
Private Sub OnLoadCompleted(ByVal lo As LoadOperation(Of Customer))
If (lo.HasError) Then
MessageBox.Show(String.Format("Retrieving data failed: {0}", lo.Error.Message))
lo.MarkErrorAsHandled()
End If
End Sub
private CustomerDomainContext _customerContext = new CustomerDomainContext();
public MainPage()
{
InitializeComponent();
LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersQuery(), OnLoadCompleted, null);
CustomerGrid.ItemsSource = loadOp.Entities;
}
private void OnLoadCompleted(LoadOperation<Customer> lo)
{
if (lo.HasError)
{
MessageBox.Show(string.Format("Retrieving data failed: {0}", lo.Error.Message));
lo.MarkErrorAsHandled();
}
}
Gestion des erreurs lors de la soumission des données
Lorsque vous soumettez des données, vous ne pouvez pas choisir de désactiver les exceptions comme avec la méthode Load. Toute erreur survenant lors de la soumission des données provoquera une exception. Vous pouvez notamment choisir parmi les options suivantes :
utiliser la méthode SubmitChanges et fournir une méthode de rappel sous forme de paramètre. Dans la méthode de rappel, gérez l'erreur et appelez la méthode MarkErrorAsHandled pour indiquer que l'exception n'est pas levée ;
utiliser la méthode SubmitChanges. Toute erreur survenant lors de la soumission des données provoquera une exception non gérée.
L'exemple suivant montre comment appeler la méthode SubmitChanges avec une méthode de rappel pour gérer les erreurs.
Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
_customerContext.SubmitChanges(AddressOf OnSubmitCompleted, Nothing)
End Sub
Private Sub RejectButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
_customerContext.RejectChanges()
CheckChanges()
End Sub
Private Sub CustomerGrid_RowEditEnded(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEditEndedEventArgs)
CheckChanges()
End Sub
Private Sub CheckChanges()
Dim changeSet = _customerContext.EntityContainer.GetChanges()
ChangeText.Text = changeSet.ToString()
Dim hasChanges = _customerContext.HasChanges
SaveButton.IsEnabled = hasChanges
RejectButton.IsEnabled = hasChanges
End Sub
Private Sub OnSubmitCompleted(ByVal so As SubmitOperation)
If (so.HasError) Then
MessageBox.Show(String.Format("Submit Failed: {0}", so.Error.Message))
so.MarkErrorAsHandled()
End If
CheckChanges()
End Sub
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
_customerContext.SubmitChanges(OnSubmitCompleted, null);
}
private void RejectButton_Click(object sender, RoutedEventArgs e)
{
_customerContext.RejectChanges();
CheckChanges();
}
private void CustomerGrid_RowEditEnded(object sender, DataGridRowEditEndedEventArgs e)
{
CheckChanges();
}
private void CheckChanges()
{
EntityChangeSet changeSet = _customerContext.EntityContainer.GetChanges();
ChangeText.Text = changeSet.ToString();
bool hasChanges = _customerContext.HasChanges;
SaveButton.IsEnabled = hasChanges;
RejectButton.IsEnabled = hasChanges;
}
private void OnSubmitCompleted(SubmitOperation so)
{
if (so.HasError)
{
MessageBox.Show(string.Format("Submit Failed: {0}", so.Error.Message));
so.MarkErrorAsHandled();
}
CheckChanges();
}
Gestion des erreurs avec opérations d'appel
Lorsque vous appelez une opération, vous disposez des mêmes options que lorsque vous soumettez des données. Vous pouvez notamment choisir parmi les options suivantes :
inclure une méthode de rappel lorsque vous appelez l'opération d'appel. Dans la méthode de rappel, gérez l'erreur et appelez la méthode MarkErrorAsHandled pour indiquer que l'exception n'est pas levée ;
appeler l'opération d'appel sans inclure de méthode de rappel. Toute erreur survenant pendant l'appel de la méthode provoquera une exception non gérée.
L'exemple suivant montre une opération d'appel avec une méthode de rappel.
Dim invokeOp As InvokeOperation(Of Integer)
invokeOp = customerContext.GetLocalTemperature(selectedPostalCode, AddressOf OnInvokeCompleted, Nothing)
Private Sub OnInvokeCompleted(ByVal invOp As InvokeOperation(Of Integer))
If (invOp.HasError) Then
MessageBox.Show(String.Format("Method Failed: {0}", invOp.Error.Message))
invOp.MarkErrorAsHandled()
Else
result = invOp.Value
End If
End Sub
InvokeOperation<int> invokeOp = customerContext.GetLocalTemperature(selectedPostalCode, OnInvokeCompleted, null);
private void OnInvokeCompleted(InvokeOperation<int> invOp)
{
if (invOp.HasError)
{
MessageBox.Show(string.Format("Method Failed: {0}", invOp.Error.Message));
invOp.MarkErrorAsHandled();
}
else
{
result = invokeOp.Value;
}
}
Gestion des erreurs avec le service d'authentification
La classe AuthenticationService vous permet de fournir une méthode de rappel lorsque vous appelez les méthodes suivantes :
Dans la méthode de rappel, vous pouvez fournir un code chargé de gérer des erreurs du service d'authentification. L'exemple suivant indique comment appeler la méthode Login à partir d'un gestionnaire d'événements pour un bouton de connexion. Une méthode de rappel est incluse pour répondre aux résultats de l'opération de connexion.
Private Sub LoginButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim lp As LoginParameters = New LoginParameters(UserName.Text, Password.Password)
WebContext.Current.Authentication.Login(lp, AddressOf Me.LoginOperation_Completed, Nothing)
LoginButton.IsEnabled = False
LoginResult.Text = ""
End Sub
Private Sub LoginOperation_Completed(ByVal lo As LoginOperation)
If (lo.HasError) Then
LoginResult.Text = lo.Error.Message
LoginResult.Visibility = System.Windows.Visibility.Visible
lo.MarkErrorAsHandled()
ElseIf (lo.LoginSuccess = False) Then
LoginResult.Text = "Login failed. Please check user name and password."
LoginResult.Visibility = System.Windows.Visibility.Visible
ElseIf (lo.LoginSuccess = True) Then
SetControlVisibility(True)
End If
LoginButton.IsEnabled = True
End Sub
private void LoginButton_Click(object sender, RoutedEventArgs e)
{
LoginParameters lp = new LoginParameters(UserName.Text, Password.Password);
WebContext.Current.Authentication.Login(lp, this.LoginOperation_Completed, null);
LoginButton.IsEnabled = false;
LoginResult.Text = "";
}
private void LoginOperation_Completed(LoginOperation lo)
{
if (lo.HasError)
{
LoginResult.Text = lo.Error.Message;
LoginResult.Visibility = System.Windows.Visibility.Visible;
lo.MarkErrorAsHandled();
}
else if (lo.LoginSuccess == false)
{
LoginResult.Text = "Login failed. Please check user name and password.";
LoginResult.Visibility = System.Windows.Visibility.Visible;
}
else if (lo.LoginSuccess == true)
{
SetControlVisibility(true);
}
LoginButton.IsEnabled = true;
}