予期される例外

ExpectedExceptions サンプルでは、型指定のあるクライアントを使用する際に、予期される例外をキャッチする方法を示します。 このサンプルは、電卓サービスを実装する「入門サンプル」に基づいています。 この例では、クライアントはコンソール アプリケーション (.exe) であり、サービスはインターネット インフォメーション サービス (IIS) によってホストされます。

Note

このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。

このサンプルでは、正しいプログラムが処理する必要のある TimeoutException および CommunicationException という 2 種類の予期される例外を、キャッチして処理する方法を示します。

Windows Communication Foundation (WCF) クライアントの通信メソッドからスローされる例外には、予期されるものと、予期しないものがあります。 予期しない例外には、OutOfMemoryException などの致命的なエラーや、ArgumentNullExceptionInvalidOperationException などのプログラミング エラーが含まれます。 一般に、予期しないエラーを処理する有効な方法はありません。したがって WCF クライアントの通信メソッドを呼び出す際、通常は、予期しないエラーをキャッチしないでください。

WCF クライアントの通信メソッドからの予期される例外には、TimeoutExceptionCommunicationExceptionCommunicationException の任意の派生クラスが含まれます。 これらは通信中の問題を示しますが、WCF クライアントを中止して通信エラーを報告すれば安全に処理できます。 どのアプリケーションでも外部要因によってこうしたエラーが発生する可能性があるので、正しいアプリケーションはこのようなエラーをキャッチし、発生した場合には回復させる必要があります。

CommunicationException の派生クラスには、クライアントがスローできるものがいくつかあります。 状況によっては、アプリケーションでこれらのサブクラスをキャッチして特別な処理を行うこともできます。しかし、それ以外の場合は CommunicationException として処理する必要があります。 この処理は、より具体的な例外の種類を最初にキャッチし、後の catch 句で CommunicationException をキャッチすることによって実現できます。

クライアントの通信メソッドを呼び出すコードでは、TimeoutExceptionCommunicationException をキャッチする必要があります。 こうしたエラーの処理方法の 1 つに、クライアントを中止して通信エラーを報告するという方法があります。

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

予期される例外が発生した場合、それ以降、クライアントを使用できる場合もできない場合もあります。 クライアントがそのまま使用可能かどうかを確認するには、State プロパティが CommunicationState.Opened であることを確認してください。 Opened の場合は、そのまま使用できます。 それ以外の場合は、クライアントを中止してすべての参照を解放する必要があります。

注意事項

一般に、セッションを持つクライアントは、例外発生後に使用できなくなり、セッションを持たないクライアントは、例外発生後も使用可能なままです。 ただし、どちらも必ずそうなるとは限りません。したがって、例外発生後も引き続きクライアントを使用する場合は、アプリケーションで State プロパティをチェックし、クライアントが Opened 状態のままであることを検証する必要があります。

このサンプルを実行すると、操作応答と例外がクライアントのコンソール ウィンドウに表示されます。

クライアント プロセスでは 2 つのシナリオが実行されます。各シナリオでは、AddDivide の順に呼び出しが試行されます。 最初のシナリオでは、Divide を呼び出す前にクライアントを中止することによってネットワーク問題をシミュレートします。 2 番目のシナリオでは、メソッドを完了できないようにタイムアウト値をごく短く設定することによって、タイムアウトを発生させます。 クライアント プロセスから予期される出力は次のとおりです。

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

サンプルをセットアップ、ビルド、および実行するには

  1. Windows Communication Foundation サンプルの 1 回限りのセットアップの手順を実行したことを確認します。

  2. ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「 Building the Windows Communication Foundation Samples」の手順に従います。

  3. 単一または複数コンピューター構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。