Compartilhar via


Exceções esperadas

O ExpectedExceptions sample demonstra como capturar exceções esperadas ao usar um cliente tipificado. Este exemplo baseia-se no Guia de 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 build para este exemplo estão localizados no final deste tópico.

Este exemplo demonstra como capturar e lidar com os dois tipos de exceção esperados que os programas corretos devem tratar: 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 eficaz de tratar erros inesperados, portanto, você não deve capturá-los ao chamar o método de comunicação de um cliente WCF.

Exceções esperadas de métodos de comunicação em um cliente WCF incluem TimeoutException, CommunicationExceptione qualquer classe derivada de CommunicationException. Isso indica 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 das CommunicationException quais um cliente pode gerar. 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 o 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 ainda estiver aberto, ainda será utilizável. Caso contrário, você deverá anular o cliente e liberar todas as referências a ele.

Cuidado

Você pode 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 delas é garantida, portanto, se você quiser tentar continuar usando o cliente após uma exceção, seu aplicativo deverá 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 uma falha de rede ao abortar 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 avulsa dos 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 o exemplo em uma configuração única ou entre máquinas, siga as instruções em Executando os exemplos do Windows Communication Foundation.