Partager via


Exceptions attendues

L’exemple ExpectedExceptions montre comment intercepter les exceptions attendues lors de l’utilisation d’un client typé. Cet exemple est basé sur le guide de démarrage qui implémente un service de calculatrice. Dans cet exemple, le client est une application console (.exe) et le service est hébergé par Internet Information Services (IIS).

Remarque

La procédure d’installation et les instructions de génération de cet exemple se trouvent à la fin de cette rubrique.

Cet exemple illustre l’interception et la gestion des deux types d’exceptions attendus qui corrigent les programmes doivent gérer : TimeoutException et CommunicationException.

Les exceptions levées à partir de méthodes de communication sur un client Windows Communication Foundation (WCF) sont attendues ou inattendues. Les exceptions inattendues incluent des défaillances catastrophiques telles que OutOfMemoryException des erreurs de programmation comme ArgumentNullException ou InvalidOperationException. En règle générale, il n’existe aucun moyen utile de gérer les erreurs inattendues. En règle générale, vous ne devez pas les intercepter lors de l’appel d’une méthode de communication client WCF.

Les exceptions attendues des méthodes de communication sur un client WCF incluent TimeoutException, CommunicationExceptionet toute classe dérivée de CommunicationException. Ceux-ci indiquent un problème lors de la communication qui peut être géré en toute sécurité en abandonnant le client WCF et en signalant un échec de communication. Étant donné que les facteurs externes peuvent provoquer ces erreurs dans n’importe quelle application, les applications correctes doivent intercepter ces exceptions et récupérer lorsqu’elles se produisent.

Il existe plusieurs classes dérivées qu’un CommunicationException client peut lever. Dans certains cas, les applications interceptent également certaines d’entre elles pour effectuer une gestion spéciale, mais laissez les autres être gérées en tant que CommunicationException. Pour ce faire, interceptez d’abord le type d’exception plus spécifique, puis interceptez CommunicationException dans une clause catch-clause ultérieure.

Le code qui appelle une méthode de communication client doit intercepter et TimeoutExceptionCommunicationException. Une façon de gérer ces erreurs consiste à abandonner le client et à signaler l’échec de communication.

try
{
    ...
    double result = client.Add(value1, value2);
    ...
    client.Close();
}
catch (TimeoutException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}
catch (CommunicationException exception)
{
    Console.WriteLine("Got {0}", exception.GetType());
    client.Abort();
}

Si une exception attendue se produit, le client peut ou non être utilisable par la suite. Pour déterminer si le client est toujours utilisable, vérifiez que la State propriété est CommunicationState. Ouvert. S’il est toujours ouvert, il est toujours utilisable. Sinon, vous devez abandonner le client et libérer toutes les références à celui-ci.

Avertissement

Vous pouvez observer que les clients qui ont une session ne sont souvent plus utilisables après une exception, et que les clients qui n’ont pas de session sont souvent toujours utilisables après une exception. Toutefois, aucun de ces éléments n’est garanti. Par conséquent, si vous souhaitez essayer de continuer à utiliser le client après une exception, votre application doit vérifier la State propriété pour vérifier que le client est toujours ouvert.

Lorsque vous exécutez l'exemple, les exceptions et réponses d'opération s'affichent dans la fenêtre de console du client.

Le processus client exécute deux scénarios, chacun d’entre eux tente d’appeler Add suivi de Divide. Le premier scénario simule un problème réseau en abandonnant le client avant d’effectuer l’appel .Divide Le deuxième scénario entraîne une condition de délai d’expiration en définissant le délai d’expiration trop court pour que la méthode se termine. Le processus client est censé donner le résultat suivant :

Add(100,15.99) = 115.99
Simulated network problem occurs...
Got System.ServiceModel.CommunicationObjectAbortedException
Add(100,15.99) = 115.99
Set timeout too short for method to complete...
Got System.TimeoutException

Pour configurer, générer et exécuter l’exemple

  1. Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.

  2. Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.

  3. Pour exécuter l’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation.