Udostępnij za pośrednictwem


Oczekiwane wyjątki

W przykładzie ExpectedExceptions pokazano, jak przechwytywać oczekiwane wyjątki podczas korzystania z typizowanego klienta. Ten przykład jest oparty na wprowadzenie , który implementuje usługę kalkulatora. W tym przykładzie klient jest aplikacją konsolową (.exe), a usługa jest hostowana przez usługi Internet Information Services (IIS).

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

W tym przykładzie pokazano przechwytywanie i obsługę dwóch oczekiwanych typów wyjątków, które poprawne programy muszą obsługiwać: TimeoutException i CommunicationException.

Wyjątki zgłaszane z metod komunikacji na kliencie programu Windows Communication Foundation (WCF) są oczekiwane lub nieoczekiwane. Nieoczekiwane wyjątki obejmują katastrofalne błędy, takie jak i błędy programowania, takie jak OutOfMemoryExceptionArgumentNullException lub InvalidOperationException. Zazwyczaj nie ma przydatnego sposobu obsługi nieoczekiwanych błędów, więc zazwyczaj nie należy ich przechwytywać podczas wywoływania metody komunikacji klienta WCF.

Oczekiwane wyjątki od metod komunikacji na kliencie WCF obejmują TimeoutException, CommunicationExceptioni dowolną klasę pochodną klasy CommunicationException. Wskazują one na problem podczas komunikacji, który można bezpiecznie obsłużyć przez przerwanie klienta programu WCF i zgłaszanie awarii komunikacji. Ponieważ czynniki zewnętrzne mogą powodować te błędy w dowolnej aplikacji, poprawne aplikacje muszą przechwytywać te wyjątki i odzyskiwać je, gdy wystąpią.

Istnieje kilka klas pochodnych CommunicationException , które klient może zgłosić. W niektórych przypadkach aplikacje przechwytują również niektóre z nich w celu wykonania specjalnej obsługi, ale niech inne będą obsługiwane jako CommunicationException. Można to osiągnąć, przechwytując najpierw bardziej szczegółowy typ wyjątku, a następnie przechwytując CommunicationException w późniejszej klauzuli catch-.

Kod wywołujący metodę komunikacji klienta musi przechwytywać metody TimeoutException i CommunicationException. Jednym ze sposobów obsługi takich błędów jest przerwanie klienta i zgłoszenie błędu komunikacji.

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

Jeśli wystąpi oczekiwany wyjątek, klient może lub nie może być później używany. Aby ustalić, czy klient jest nadal używany, sprawdź, czy State właściwość ma wartość CommunicationState. Otwarte. Jeśli nadal jest otwarty, nadal można go używać. W przeciwnym razie należy przerwać klienta i zwolnić wszystkie odwołania do niego.

Uwaga

Można zauważyć, że klienci, którzy mają sesję, często nie mogą już używać po wystąpieniu wyjątku, a klienci, którzy nie mają sesji, są często używane po wystąpieniu wyjątku. Jednak żadna z nich nie jest gwarantowana, więc jeśli chcesz kontynuować korzystanie z klienta po wyjątku, aplikacja powinna sprawdzić State właściwość, aby sprawdzić, czy klient jest nadal otwarty.

Po uruchomieniu przykładu odpowiedzi i wyjątki operacji są wyświetlane w oknie konsoli klienta.

Proces klienta uruchamia dwa scenariusze, z których każda próbuje wywołać Add metodę Divide, a następnie . Pierwszy scenariusz symuluje problem z siecią, przerywając klienta przed wywołaniem metody Divide. Drugi scenariusz powoduje przekroczenie limitu czasu przez ustawienie limitu czasu zbyt krótkiego, aby metoda została ukończona. Oczekiwane dane wyjściowe z procesu klienta to:

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

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.