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

В примере ExpectedExceptions показано, как перехватывать ожидаемые исключения при использовании типизированного клиента. Этот пример основан на начале работы , который реализует службу калькулятора. В этом образце клиентом является консольное приложение (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".