Ожидаемые исключения
В этом образце показано, как перехватывать ожидаемые исключения при использовании типизированного клиента. Данный образец основан на образце Образец для начала работы, реализующем службу калькулятора. В этом образце клиентом является консольное приложение (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, следуйте инструкциям раздела Построение образцов Windows Communication Foundation.
Чтобы выполнить образец на одном или нескольких компьютерах, следуйте инструкциям в разделе Running the Windows Communication Foundation Samples.
Примечание |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WCF\Basic\Client\ExpectedExceptions
|