Ожидаемые исключения
В примере 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
Настройка, сборка и выполнение образца
Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.
Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".