ExpectedExceptions 샘플은 형식화된 클라이언트를 사용할 때 예상되는 예외를 catch하는 방법을 보여 줍니다. 이 샘플은 계산기 서비스를 구현하는 시작 서비스를 기반으로 합니다. 이 샘플에서 클라이언트는 콘솔 애플리케이션(.exe)이며 서비스는 IIS(인터넷 정보 서비스)에서 호스팅됩니다.
비고
이 샘플에 대한 설치 절차 및 빌드 지침은 이 항목의 끝에 있습니다.
이 샘플에서는 올바른 프로그램에서 반드시 처리해야 하는 두 가지 예상되는 예외 유형인 TimeoutException
및 CommunicationException
을 잡아서 처리하는 방법을 보여 줍니다.
WCF(Windows Communication Foundation) 클라이언트의 통신 메서드에서 throw되는 예외는 예상된 것 또는 예기치 않은 것입니다. 예기치 않은 예외에는 OutOfMemoryException
와 같은 치명적인 오류나 ArgumentNullException
또는 InvalidOperationException
의 프로그래밍 오류가 포함됩니다. 예기치 않은 오류를 처리하는 유용한 방법이 없기 때문에, WCF 클라이언트 통신 메서드를 호출할 때 이러한 오류를 잡지 않는 것이 좋습니다.
WCF 클라이언트의 통신 메서드에서 예상되는 예외에는 TimeoutException
, CommunicationException
, 그리고 CommunicationException
의 파생 클래스가 포함됩니다. 이는 통신 중에 WCF 클라이언트를 중단하고 통신 오류를 보고하여 안전하게 처리할 수 있는 문제를 나타냅니다. 외부 요인으로 인해 모든 애플리케이션에서 이러한 오류가 발생할 수 있으므로 올바른 애플리케이션은 이러한 예외를 catch하고 발생할 때 복구해야 합니다.
클라이언트가 throw할 수 있는 몇 가지 파생 클래스 CommunicationException
가 있습니다. 경우에 따라 애플리케이션은 일부를 catch하여 특수한 처리를 수행하지만, 나머지는 CommunicationException
로 처리할 수 있도록 합니다. 보다 구체적인 예외 유형을 먼저 잡은 다음, 이후의 catch 절에서 CommunicationException
를 잡아 이 작업을 수행할 수 있습니다.
클라이언트 통신 메서드를 호출하는 코드는 TimeoutException
와 CommunicationException
을 catch해야 합니다. 이러한 오류를 처리하는 한 가지 방법은 클라이언트를 중단하고 통신 오류를 보고하는 것입니다.
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
샘플을 설정, 빌드 및 실행하려면
Windows Communication Foundation 샘플 에 대한One-Time 설정 절차를 수행했는지 확인합니다.
솔루션의 C# 또는 Visual Basic .NET 버전을 빌드하려면 Windows Communication Foundation 샘플빌드의 지침을 따릅니다.
단일 또는 컴퓨터 간 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플실행의 지침을 따릅니다.