2010-06-13 3 views
3

알았습니다. 여기에 뭔가 빠져 있습니다. 나는 다음과 같은 작업 계약이 :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> 예외를 잡을 수 있었다.

답변

3

임의의 데이터 계약 유형의 경우 FaultException<DataContract>으로 시도해보십시오. 프록시 클래스에서 오류에 대해 생성 된 코드를 보면 ArgumentException이 예상대로 직렬화되지 않는다는 것을 알 수 있습니다.

+0

을 물론 가지고 있는지 확인하십시오. 사용자 정의 예외 클래스가 있고이를 사용하여 catch 및 catch하는 경우 작동합니다. ArgumentException을 사용하여 작동 (직렬화)하지 않는 이유는 확실하지 않습니다. –

+1

@Ashish : Exception이 DataContractSerializer를 사용하여 직렬화 할 이유가 없습니다. 결함 유형으로 예외를 사용하지 마십시오. 그것들은 클라이언트에게 SOAP Faults로 제대로 나타나지 않을 것입니다. 이것은 SOAP 오류에 관한 것이 아닙니다. –

+0

답장을 보내 주셔서 감사합니다. 나는 WCF에 대해 매우 익숙해졌으며 아마도 "예외"(또는 해당 클래스) 시스템을 사용하는 대신 사용자 정의 예외 클래스를 DataContract로 사용할 것임을 알았습니다. –

0

는 예외 클래스를 파생하는 경우, 사용자 정의 예외가 직렬화 생성자

protected MyCustomException(
      SerializationInfo info, 
      StreamingContext context) 
      : base(info, context) { }