Eccezioni previste

Nell’esempio ExpectedExceptions viene illustrato come rilevare le eccezioni previste quando si utilizza un client tipizzato. Questo esempio si basa sull'Introduzione che implementa un servizio calcolatrice. In questo esempio, il client è un'applicazione console (.exe) e il servizio è ospitato da Internet Information Services (IIS).

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.

In questo esempio viene illustrata l'intercettazione e la gestione di due tipi di eccezione previsti che devono essere gestiti da programmi specifici, ovvero TimeoutException e CommunicationException.

Le eccezioni generate dai metodi di comunicazione in un client Windows Communication Foundation (WCF) possono essere previste o impreviste. Le eccezioni impreviste includono gli errori irreversibili come OutOfMemoryException e gli errori di programmazione come ArgumentNullException o InvalidOperationException. Gli errori imprevisti non possono essere gestiti in modo utile, pertanto in genere non è necessario rilevarli quando si chiama un metodo di comunicazione client WCF.

Le eccezioni previste dai metodi di comunicazione su un client WCF includono TimeoutException, CommunicationException e qualsiasi classe derivata da CommunicationException. Queste eccezioni indicano un problema durante la comunicazione che può essere gestita correttamente interrompendo il client WCF e riportando un errore di comunicazione. Perché fattori esterni possono provocare questi errori in qualsiasi applicazione, le eccezioni devono essere rilevate da applicazioni specifiche e deve essere eseguito il ripristino quando si verificano.

Un client può generare numerose classi derivate di CommunicationException. In alcuni casi, le applicazioni rilevano anche alcune di queste eccezioni per una gestione speciale, ma lasciano che le altre vengano gestite come CommunicationException. Questo processo può essere portato a termine rilevando prima il tipo di eccezione più specifico e quindi CommunicationException in una clausola di rilevamento successiva.

Il codice che chiama un metodo di comunicazione client deve rilevare TimeoutException e CommunicationException. Un modo per gestire tali errori consiste nell'interrompere il client e riportare l'errore di comunicazione.

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

In seguito a un'eccezione prevista, il client può essere utilizzabile o non esserlo. Per determinare se il client può ancora essere utilizzato, verificare che la proprietà State sia impostata su CommunicationState.Opened. Se è aperto, può essere ancora utilizzato. In caso contrario è necessario interrompere il client e rilasciare tutti i riferimenti attinenti.

Attenzione

È possibile osservare che i client che dispongono di una sessione spesso possono più essere utilizzati dopo un'eccezione, mentre i client privi di una sessione spesso possono ancora essere utilizzati dopo un'eccezione. Tuttavia, nessuno di questi comportamenti è garantito, pertanto se si desidera continuare a utilizzare il client dopo un'eccezione, l'applicazione dovere controllare la proprietà State per verificare che il client sia ancora aperto.

Quando si esegue l'esempio, le risposte e le eccezioni dell'operazione vengono visualizzate nella finestra della console client.

Il processo client esegue due scenari, ognuno dei quali tenta di chiamare Add seguito da Divide. Il primo scenario simula un problema di rete interrompendo il client prima di effettuare la chiamata a Divide. Il secondo scenario provoca una condizione di timeout impostando un valore di timeout troppo breve per consentire il completamento del metodo. L'output previsto dal processo client è:

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

Per impostare, compilare ed eseguire l'esempio

  1. Assicurarsi di aver eseguito la Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Building the Windows Communication Foundation Samples.

  3. Per eseguire l'esempio in un solo computer o tra computer diversi, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation.