Excepciones esperadas

El ejemplo ExpectedExceptions muestra cómo capturar las excepciones esperadas cuando se usa un cliente con tipo. Este ejemplo se basa en la Introducción que implementa un servicio de calculadora. En este ejemplo, el cliente es una aplicación de consola (.exe) y los Servicios de Internet Information Server (IIS) hospedan el servicio.

Nota

El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.

Este ejemplo muestra la detección y administración de dos tipos de excepciones esperadas que los programas correctos deben gestionar: TimeoutException y CommunicationException.

Las excepciones que se producen a partir de los métodos de comunicación en un cliente de Windows Communication Foundation (WCF) pueden ser esperadas o inesperadas. Las inesperadas incluyen errores graves como OutOfMemoryException y errores de programación como ArgumentNullException o InvalidOperationException. No suele haber ninguna forma útil de administrar errores inesperados, por lo que normalmente no debería detectarlos cuando se llama a un método de comunicación de cliente WCF.

Las excepciones esperadas de los métodos de comunicación en el cliente WCF incluyen TimeoutException, CommunicationException y cualquier clase derivada de CommunicationException. Indican un problema durante la comunicación que se puede administrar sin ningún riesgo si se anula el cliente WCF y se crea un informe de un error de comunicación. Dado que los factores externos pueden producir estos errores en cualquier aplicación, las aplicaciones correctas deben detectar estas excepciones y recuperarse cuando se produzcan.

Hay varias clases derivadas de CommunicationException que un cliente puede iniciar. En algunos casos, las aplicaciones detectan también algunas de ellas para que se gestionen de forma especial, pero deja que otras las gestionen como CommunicationException. Esto se puede lograr detectando el tipo de excepción más concreto primero y detectando a continuación CommunicationException en una cláusula catch posterior.

El código que llama a un método de comunicación de cliente debe detectar TimeoutException y CommunicationException. Una manera de administrar tales errores es anular el cliente e informar del error de comunicación.

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

Si se produce una excepción esperada, el cliente podrá utilizarse después o no. Para determinar si el cliente todavía se puede utilizar, compruebe que la propiedad State sea CommunicationState.Opened. Si está abierta aún, se podría utilizar. De lo contrario debería anular el cliente y liberar todas las referencias a él.

Precaución

Puede observar que, en ocasiones, los clientes que tienen una sesión no se pueden usar después de una excepción. Los clientes que no tienen una sesión se pueden seguir usando después de una excepción. Sin embargo, no se garantiza ninguno de ellos, de manera que si intenta continuar usando el cliente después de una excepción, la aplicación debería comprobar la propiedad State para comprobar que el cliente sigue abierto.

Al ejecutar el ejemplo, las respuestas y excepciones de la operación se muestran en la ventana de la consola del cliente.

El proceso de cliente ejecuta dos escenarios, cada uno de los cuales intenta llamar a Add seguido por Divide. El primer escenario simula un problema de la red anulando el cliente antes de realizar la llamada a Divide. El segundo escenario produce una condición de tiempo de espera agotado definiendo un tiempo de espera demasiado corto para que el método pueda completarse. El resultado esperado del proceso de cliente es:

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

Configurar, compilar y ejecutar el ejemplo

  1. Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.

  2. Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.

  3. Para ejecutar el ejemplo en una configuración de una sola máquina o de varias máquinas, siga las instrucciones que se indican en Ejecución de los ejemplos de Windows Communication Foundation.