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 OutOfMemoryException
ArgumentNullException
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
, CommunicationException
i 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
Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.
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).
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.