Ожидаемые исключения

Образец експектедексцептионс демонстрирует перехват ожидаемых исключений при использовании типизированного клиента. Этот образец основан на Начало работы , который реализует службу калькулятора. В этом образце клиентом является консольное приложение (EXE), а служба размещается в службах IIS.

Примечание

Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.

В этом образце показано кэширование и обработка ожидаемых исключений двух типов, которые должны обрабатываться правильно работающими программами: TimeoutException и CommunicationException.

исключения, вызванные методами связи в клиенте Windows Communication Foundation (WCF), являются ожидаемыми или непредвиденными. Неожиданные исключения включают разрушительный сбой, например OutOfMemoryException, и ошибки программирования, например ArgumentNullException или InvalidOperationException. Обычно не существует удобного способа решения непредвиденных ошибок, поэтому обычно не следует перехватывать их при вызове метода связи клиента WCF.

Ожидаемые исключения из методов связи в клиенте WCF включают TimeoutException , CommunicationException и любой производный класс CommunicationException . Они указывают на проблему во время обмена данными, которая может быть безопасно обработана путем прерывания работы клиента WCF и сообщения об ошибке связи. Поскольку внешние факторы могут вызывать появление таких ошибок в любом приложении, правильно разработанные приложения должны перехватывать эти исключения и предпринимать соответствующие восстановительные меры.

Имеется несколько классов, производных от CommunicationException, которые могут создаваться клиентом. В некоторых случаях приложение может также перехватывать определенные исключения, чтобы выполнять специальную обработку, и обрабатывать оставшиеся исключения как исключения типа CommunicationException. Чтобы реализовать это, необходимо в первую очередь перехватывать более узкие виды исключений, а лишь затем перехватывать исключение CommunicationException в более позднем предложении catch.

Код, вызывающий методы взаимодействия, должен перехватывать исключения TimeoutException и CommunicationException. Один из способов обработки таких ошибок заключается в прерывании работы клиента и создании сообщения о сбое взаимодействия.

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

Если происходит ожидаемое исключение, клиент может стать или не стать непригодным к использованию в дальнейшем. Чтобы определить, можно ли использовать клиент, проверьте, что свойство State имеет значение CommunicationState.Opened. Если свойство имеет значение Opened, клиент можно использовать. В противном случае необходимо прервать работу клиента и освободить все ссылки на него.

Внимание!

Можно заметить, что клиенты с сеансом невозможно использовать после возникновения исключения, а клиенты без сеансов использовать после исключения можно. Однако это не является универсальным правилом, поэтому если требуется продолжать использовать клиент после исключения, приложение должно проверить значение свойства State, чтобы убедиться, что клиент еще открыт.

При выполнении образца ответы и исключения операций отображаются в окне консоли клиента.

Клиентский процесс выполняет два сценария, каждый из которых пытается выполнить операцию Add, а затем операцию Divide. Первый сценарий имитирует сбой в работе сети путем прерывания работы клиента перед вызовом Divide. Второй сценарий вызывает возникновение таймаута путем задания слишком короткого времени ожидания завершения метода. Ниже представлен ожидаемый результат выполнения клиентского процесса.

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

Настройка, сборка и выполнение образца

  1. убедитесь, что вы выполнили однократную процедуру настройки для Windows Communication Foundation примеров.

  2. Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.

  3. чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе выполнение примеров Windows Communication Foundation.