次の方法で共有


予期される例外

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

このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。

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

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

WCF クライアント上の通信メソッドからの予期される例外には、 TimeoutExceptionCommunicationException、および CommunicationExceptionの派生クラスが含まれます。 これらは、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されていることを確認します。開けた。 まだ開いている場合は、引き続き使用できます。 それ以外の場合は、クライアントを中止し、そのクライアントへのすべての参照を解放する必要があります。

注意事項

多くの場合、セッションを持つクライアントは例外の後に使用できなくなり、セッションを持たないクライアントは例外の後も引き続き使用できます。 ただし、どちらも保証されないため、例外の後にクライアントの使用を続行する場合は、アプリケーションで State プロパティを確認して、クライアントがまだ開かれているかどうかを確認する必要があります。

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

クライアント プロセスは 2 つのシナリオを実行し、それぞれが Add を呼び出し、その後に Divide を呼び出そうとします。 最初のシナリオでは、 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 サンプル One-Time セットアップ手順を実行していることを確認します。

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

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