Dela via


Förväntade undantag

Exemplet ExpectedExceptions visar hur du fångar förväntade undantag när du använder en typad klient. Det här exemplet baseras på komma igång som implementerar en kalkylatortjänst. I det här exemplet är klienten ett konsolprogram (.exe) och tjänsten hanteras av Internet Information Services (IIS).

Kommentar

Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.

Det här exemplet visar hur du fångar och hanterar de två förväntade undantagstyperna som rätt program måste hantera: TimeoutException och CommunicationException.

Undantag som genereras från kommunikationsmetoder på en WCF-klient (Windows Communication Foundation) är antingen förväntade eller oväntade. Oväntade undantag inkluderar katastrofala fel som OutOfMemoryException och programmeringsfel som ArgumentNullException eller InvalidOperationException. Vanligtvis finns det inget användbart sätt att hantera oväntade fel, så vanligtvis bör du inte fånga dem när du anropar en WCF-klientkommunikationsmetod.

Förväntade undantag från kommunikationsmetoder på en WCF-klient inkluderar TimeoutException, CommunicationExceptionoch alla härledda klasser av CommunicationException. Dessa indikerar ett problem under kommunikationen som kan hanteras på ett säkert sätt genom att avbryta WCF-klienten och rapportera ett kommunikationsfel. Eftersom externa faktorer kan orsaka dessa fel i alla program, måste rätt program fånga dessa undantag och återställa när de inträffar.

Det finns flera härledda klasser av CommunicationException som en klient kan utlösa. I vissa fall fångar program också några av dessa för att utföra särskild hantering, men låter de andra hanteras som en CommunicationException. Detta kan åstadkommas genom att fånga den mer specifika undantagstypen först och sedan fånga CommunicationException in en senare catch-clause.

Kod som anropar en klientkommunikationsmetod måste fånga TimeoutException och CommunicationException. Ett sätt att hantera sådana fel är att avbryta klienten och rapportera kommunikationsfelet.

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

Om ett förväntat undantag inträffar kan klienten kanske eller kanske inte kan användas efteråt. Kontrollera att egenskapen är CommunicationStateför att State avgöra om klienten fortfarande kan användas. Öppnade. Om den fortfarande är öppen är den fortfarande användbar. Annars bör du avbryta klienten och släppa alla referenser till den.

Varning

Du kan observera att klienter som har en session ofta inte längre kan användas efter ett undantag, och klienter som inte har en session kan ofta fortfarande användas efter ett undantag. Inget av dessa garanteras, så om du vill försöka fortsätta använda klienten efter ett undantag bör programmet kontrollera State egenskapen för att kontrollera att klienten fortfarande är öppen.

När du kör exemplet visas åtgärdssvaren och undantagen i klientkonsolfönstret.

Klientprocessen kör två scenarier som var och en försöker anropa Add följt av Divide. Det första scenariot simulerar ett nätverksproblem genom att avbryta klienten innan anropet till Divide. Det andra scenariot orsakar ett timeout-villkor genom att ställa in tidsgränsen för kort för att metoden ska slutföras. Förväntade utdata från klientprocessen är:

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

Så här konfigurerar du, skapar och kör exemplet

  1. Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.

  2. Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.

  3. Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.