Udostępnij przez


Oczekiwane wyjątki

W przykładzie ExpectedExceptions pokazano, jak przechwytywać oczekiwane wyjątki podczas korzystania z typizowanego klienta. Ten przykład jest oparty na Rozpoczęcie, które 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 / Notatka

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 mogą być rzucone przez klienta. W niektórych sytuacjach aplikacje przechwytują niektóre z nich w celu wykonania specjalnej obsługi, ale pozostałe są 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 zakończyć działanie klienta i zwolnić wszystkie odwołania do niego.

Ostrzeżenie

Można zauważyć, że klienci, którzy mają sesję, często nie są już dostępni po wystąpieniu wyjątku, a klienci, którzy nie mają sesji, mogą być nadal dostępni 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żdy próbuje wywołać Add, a następnie Divide. Pierwszy scenariusz symuluje problem z siecią poprzez zakończenie działania klienta przed wywołaniem funkcji 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ładowy program

  1. Upewnij się, że wykonano procedurę instalacji One-Time 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 Kompilowanie przykładów Windows Communication Foundation.

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