Partager via


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;
}