Delen via


Verwachte uitzonderingen

Het voorbeeld ExpectedExceptions laat zien hoe u verwachte uitzonderingen kunt ondervangen bij het gebruik van een getypte client. Dit voorbeeld is gebaseerd op de Aan de slag die een rekenmachineservice implementeert. In dit voorbeeld is de client een consoletoepassing (.exe) en wordt de service gehost door Internet Information Services (IIS).

Notitie

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

In dit voorbeeld ziet u hoe u de twee verwachte uitzonderingstypen kunt vangen en verwerken die de juiste programma's moeten verwerken: TimeoutException en CommunicationException.

Uitzonderingen die worden gegenereerd op basis van communicatiemethoden op een WCF-client (Windows Communication Foundation) worden verwacht of onverwacht. Onverwachte uitzonderingen zijn onherstelbare fouten zoals OutOfMemoryException en programmeerfouten zoals ArgumentNullException of InvalidOperationException. Normaal gesproken is er geen handige manier om onverwachte fouten af te handelen, dus doorgaans moet u ze niet vangen bij het aanroepen van een WCF-clientcommunicatiemethode.

Verwachte uitzonderingen van communicatiemethoden op een WCF-client omvatten TimeoutException, CommunicationExceptionen elke afgeleide klasse van CommunicationException. Deze duiden op een probleem tijdens de communicatie die veilig kan worden afgehandeld door de WCF-client af te splitsen en een communicatiefout te melden. Omdat externe factoren deze fouten in elke toepassing kunnen veroorzaken, moeten de juiste toepassingen deze uitzonderingen ondervangen en herstellen wanneer ze optreden.

Er zijn verschillende afgeleide klassen waarvan CommunicationException een client kan gooien. In sommige gevallen vangen toepassingen ook enkele van deze om speciale afhandeling uit te voeren, maar laten de andere worden afgehandeld als een CommunicationException. Dit kan worden bereikt door eerst het specifiekere uitzonderingstype te vangen en vervolgens te vangen CommunicationException in een latere catch-component.

Code die een clientcommunicatiemethode aanroept, moet de TimeoutException en CommunicationException. Een manier om dergelijke fouten af te handelen, is door de client af te breken en de communicatiefout te melden.

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

Als er een verwachte uitzondering optreedt, kan de client later wel of niet bruikbaar zijn. Als u wilt bepalen of de client nog steeds bruikbaar is, controleert u of de State eigenschap is CommunicationState. Geopend. Als het nog steeds wordt geopend, is het nog steeds bruikbaar. Anders moet u de client afbreken en alle verwijzingen naar de client vrijgeven.

Let op

U kunt zien dat clients die een sessie hebben vaak niet meer bruikbaar zijn na een uitzondering en clients die geen sessie hebben, nog steeds bruikbaar zijn na een uitzondering. Geen van deze is echter gegarandeerd, dus als u de client wilt blijven gebruiken na een uitzondering, moet uw toepassing de State eigenschap controleren om te controleren of de client nog steeds wordt geopend.

Wanneer u het voorbeeld uitvoert, worden de bewerkingsreacties en uitzonderingen weergegeven in het venster van de clientconsole.

Het clientproces voert twee scenario's uit, die elk worden aangeroepen Add gevolgd door Divide. In het eerste scenario wordt een netwerkprobleem gesimuleerd door de client af te splitsen voordat de aanroep wordt uitgevoerd Divide. In het tweede scenario wordt een time-outvoorwaarde veroorzaakt door de time-out in te stellen die te kort is om de methode te voltooien. De verwachte uitvoer van het clientproces is:

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

Het voorbeeld instellen, compileren en uitvoeren

  1. Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.

  3. Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.