预期异常

ExpectedExceptions 示例演示如何在使用类型化客户端时捕获预期的异常。 此示例基于《入门指南》,实现了计算器服务。 在此示例中,客户端是一个控制台应用程序 (.exe),服务是由 Internet 信息服务 (IIS) 承载的。

注释

本示例的设置过程和生成说明位于本主题末尾。

此示例演示捕获和处理正确程序必须处理的两种预期异常类型: TimeoutExceptionCommunicationException

Windows Communication Foundation (WCF) 客户端上从通信方法中引发的异常要么是预期异常,要么是意外异常。 意外异常包括灾难性故障,如OutOfMemoryException,以及编程错误,如ArgumentNullExceptionInvalidOperationException。 通常没有有用的方法来处理意外错误,因此通常不应在调用 WCF 客户端通信方法时捕获它们。

WCF 客户端中的通信方法预期的异常包括 TimeoutExceptionCommunicationException 和任何 CommunicationException 的派生类。 这些指示在通信过程中出现问题,可以通过中止 WCF 客户端并报告通信失败来安全地处理该问题。 由于外部因素可能导致任何应用程序中出现这些错误,因此正确的应用程序必须捕获这些异常并在发生时恢复。

有多个CommunicationException的派生类可供客户端抛出。 在某些情况下,应用程序也会捕获其中的某些类以执行特殊的处理,而让其他类作为 CommunicationException 进行处理。 这可以通过先捕获比较具体的异常类型,然后在稍后的 catch 子句中捕获 CommunicationException 来完成。

调用客户端通信方法的代码必须捕获 TimeoutExceptionCommunicationException。 处理此类错误的一种方法是中止客户端并报告通信失败。

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。 如果它仍处于打开状态,则仍可用。 否则,则应中止客户端并释放对其的所有引用。

谨慎

你可能会发现,具有会话的客户端在异常后通常不再可用,没有会话的客户端在异常后通常仍然可用。 但是,这两者都不保证,因此,如果希望在出现异常后尝试继续使用客户端,应用程序应检查 State 该属性以验证客户端是否已打开。

运行示例时,作响应和异常将显示在客户端控制台窗口中。

客户端进程运行两种情景,每种情景都尝试调用 Add 然后 Divide。 第一种方案通过在调用 Divide之前中止客户端来模拟网络问题。 第二个方案通过将超时设置为太短的时间而使方法无法完成,从而导致超时情况的发生。 客户端进程的预期输出为:

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 示例中的说明进行操作。