알았습니다. 여기에 뭔가 빠져 있습니다. 나는 다음과 같은 작업 계약이 :FaultException <T>() 클라이언트 catch에 의해 서비스에 의해 throw 된 예외가 발생했습니다. (FaultException <T>)
public double DivideByZero(int x, int y)
{
if (y == 0)
{
throw new FaultException<ArgumentException>
(new ArgumentException("Just some dummy exception")
,new FaultReason("some very bogus reason"), new FaultCode("007"));
}
return x/y;
}
을 그리고 클라이언트에서 가져온 다음 : - 위의 경우 캐치에
Console.WriteLine("Enter the x value");
string x = Console.ReadLine();
Console.WriteLine("Enter the Y value");
string y = Console.ReadLine();
try
{
double val = client.DivideByZero(Convert.ToInt32(x), Convert.ToInt32(y));
Console.WriteLine("The result is " + val.ToString());
}
catch(FaultException<ArgumentException> exp)
{
Console.WriteLine("An ArgumentException was thrown by the service "+ exp.ToString());
}
catch (Exception exp)
{
Console.WriteLine(exp.ToString());
}
(오류 예외 특급) (첫 번째 catch 블록을 경우 ArgumentException와 클라이언트 코드에) 블록이 실행되지 않습니다. 그러나, catch (FaultException exp)를하기 위해 ArgumentException을 제거하면 동일한 catch 블록이 실행됩니다. 나는 내 작전 계약에서 FaultException을 던지고 있기 때문에 이것에 대해 확신하지 못한다. 나는 여기서 아무것도 놓친다.
당신의 도움이, 인 Ashish을 감사합니다
편집 : - 내 클라이언트에 서비스 참조를 업데이트 할 때, 나는 FaultException<ArgumentException>
예외를 잡을 수 있었다.
을 물론 가지고 있는지 확인하십시오. 사용자 정의 예외 클래스가 있고이를 사용하여 catch 및 catch하는 경우 작동합니다. ArgumentException을 사용하여 작동 (직렬화)하지 않는 이유는 확실하지 않습니다. –
@Ashish : Exception이 DataContractSerializer를 사용하여 직렬화 할 이유가 없습니다. 결함 유형으로 예외를 사용하지 마십시오. 그것들은 클라이언트에게 SOAP Faults로 제대로 나타나지 않을 것입니다. 이것은 SOAP 오류에 관한 것이 아닙니다. –
답장을 보내 주셔서 감사합니다. 나는 WCF에 대해 매우 익숙해졌으며 아마도 "예외"(또는 해당 클래스) 시스템을 사용하는 대신 사용자 정의 예외 클래스를 DataContract로 사용할 것임을 알았습니다. –