Exceções esperadas

O exemplo ExpectedExceptions demonstra como capturar exceções esperadas ao usar um cliente com tipo. Este exemplo se baseia na Introdução que implementa um serviço de calculadora. Nesta amostra, o cliente é um aplicativo de console (.exe) e o serviço é hospedado pelos Serviços de Informações da Internet (IIS).

Observação

O procedimento de instalação e as instruções de compilação dessa amostra estão no final deste tópico.

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

Exceções geradas de métodos de comunicação em um cliente do WCF (Windows Communication Foundation) podem ser 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á uma maneira útil de lidar com erros inesperados. Portanto, normalmente você não deve capturá-los ao chamar um método de comunicação do cliente WCF.

Exceções esperadas de métodos de comunicação em um cliente WCF incluem TimeoutException, CommunicationExceptione qualquer classe derivada de CommunicationException. Elas 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 se recuperar quando ocorrerem.

Há várias classes derivadas de CommunicationException que um cliente pode lançar. Em alguns casos, os aplicativos também capturam algumas delas para fazer um tratamento especial, mas permitem que as outras sejam tratadas como um CommunicationException. Isso pode ser feito capturando primeiro o tipo de exceção mais específico e então capturando CommunicationException em uma cláusula catch posterior.

O código que chama um método de comunicação do cliente deve capturar TimeoutException e CommunicationException. Uma maneira de lidar com esses erros é anular 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 poderá ou não ser utilizável posteriormente. Para determinar se o cliente ainda está utilizável, verifique se a propriedade State está CommunicationState.Em aberto. Se ela ainda estiver em aberto, ainda estará utilizável. Caso contrário, você deverá anular o cliente e liberar todas as referências a ele.

Cuidado

Você pode vir a observar que os clientes que têm uma sessão geralmente 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, nenhuma dessas situações é garantida. Portanto, se você quiser tentar usar o cliente após uma exceção, seu aplicativo deverá verificar a propriedade State para verificar se o cliente ainda está em aberto.

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

O processo do cliente executa dois cenários, e cada um deles tenta chamar Add seguido por Divide. O primeiro cenário simula um problema de rede anulando o cliente antes de fazer a chamada para Divide. O segundo cenário causa uma condição de tempo limite configurando 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. Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.

  3. Para executar a amostra em uma configuração de computador único ou entre computadores, siga as instruções contidas em Como executar as amostras do Windows Communication Foundation.