Partilhar via


Exceções esperadas

O exemplo ExpectedExceptions demonstra como capturar exceções esperadas ao usar um cliente tipado. Este exemplo é baseado na Introdução que implementa um serviço de calculadora. Neste exemplo, o cliente é um aplicativo de console (.exe) e o serviço é hospedado pelo IIS (Serviços de Informações da Internet).

Nota

O procedimento de configuração e as instruções de compilação para este exemplo estão localizados no final deste tópico.

Este exemplo demonstra a captura e manipulação dos dois tipos de exceção esperados que os programas corretos devem manipular: TimeoutException e CommunicationException.

Exceções que são lançadas de métodos de comunicação em um cliente Windows Communication Foundation (WCF) são esperadas ou inesperadas. Exceções inesperadas incluem falhas catastróficas como OutOfMemoryException e erros de programação como ArgumentNullException ou InvalidOperationException. Normalmente, não há nenhuma maneira útil de lidar com erros inesperados, portanto, normalmente, você não deve detetá-los ao chamar um método de comunicação de cliente WCF.

As exceções esperadas dos métodos de comunicação em um cliente WCF incluem TimeoutException, CommunicationExceptione qualquer classe derivada de CommunicationException. Eles indicam um problema durante a comunicação que pode ser tratado com segurança anulando o cliente WCF e relatando uma falha de comunicação. Como fatores externos podem causar esses erros em qualquer aplicativo, os aplicativos corretos devem capturar essas exceções e recuperar quando elas ocorrerem.

Existem várias classes derivadas de CommunicationException que um cliente pode lançar. Em alguns casos, os aplicativos também pegam alguns deles para fazer um manuseio especial, mas deixe que os outros sejam manipulados como um CommunicationException. Isto pode ser conseguido capturando primeiro o tipo de exceção mais específico e, em seguida, capturando CommunicationException uma cláusula de captura posterior.

O código que chama um método de comunicação do cliente deve capturar o TimeoutException e CommunicationException. Uma maneira de lidar com esses erros é abortar o cliente e relatar a falha de comunicação.

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

Se ocorrer uma exceção esperada, o cliente pode ou não ser utilizável posteriormente. Para determinar se o cliente ainda é utilizável, verifique se a State propriedade é CommunicationState. Aberto. Se ainda estiver aberto, ainda é utilizável. Caso contrário, você deve abortar o cliente e liberar todas as referências a ele.

Atenção

Você pode observar que os clientes que têm uma sessão muitas vezes não são mais utilizáveis após uma exceção, e os clientes que não têm uma sessão geralmente ainda são utilizáveis após uma exceção. No entanto, nenhum deles é garantido, portanto, se você quiser tentar continuar usando o cliente após uma exceção, seu aplicativo deve verificar a State propriedade para verificar se o cliente ainda está aberto.

Quando você executa o exemplo, as respostas e exceções da operação são exibidas na janela do console do cliente.

O processo do cliente executa dois cenários, cada um dos quais tenta chamar Add seguido por Divide. O primeiro cenário simula um problema de rede anulando o cliente antes de fazer a chamada para Divideo . O segundo cenário causa uma condição de tempo limite definindo o tempo limite muito curto para que o método seja concluído. A saída esperada do processo do cliente é:

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

Para configurar, compilar e executar o exemplo

  1. Certifique-se de ter executado o procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para criar a edição C# ou Visual Basic .NET da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.

  3. Para executar o exemplo em uma configuração de máquina única ou cruzada, siga as instruções em Executando os exemplos do Windows Communication Foundation.