2010-06-13 3 views
3

Хорошо, я знаю, что здесь что-то не хватает. У меня есть следующий контракт операции:FaultException <T>() исключение, вызванное службой, не улавливается улавливанием клиента (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()); 
    } 

В приведенном выше случае улов (FaultException ехр) (первый блок поймать с ArgumentException в коде клиента) блок не выполняется. Однако, когда я удаляю ArgumentException, чтобы иметь catch (FaultException exp), выполняется тот же блок catch. Я не уверен в этом, поскольку я бросаю FaultException из моего контракта на операцию. Я что-то пропустил здесь.

Цените вашу помощь, Ashish

EDIT: - Когда я обновил ссылку на службу в моем клиенте, я был в состоянии поймать FaultException<ArgumentException> исключение.

ответ

3

Попробуйте с помощью FaultException<DataContract> для получения некоторых данных тип контракта. Если вы посмотрите на сгенерированный код ошибки в прокси-классе, я уверен, вы увидите, что ArgumentException не сериализует то, как вы ожидаете.

+0

Абсолютно. Если у вас есть собственный класс исключений и его использовать, чтобы бросить и поймать, он работает. Не уверен, почему он не будет работать (сериализоваться) с ArgumentException. –

+1

@Ashish: нет причин для сериализации «Исключение» с помощью DataContractSerializer. Не используйте исключения как тип неисправности. Они не будут отображаться должным образом как ошибки SOAP для клиентов. Это не то, о чем говорят SOAP Faults. –

+0

спасибо за ответ. Я очень новичок в WCF и понимаю, что вы, вероятно, будете использовать свой собственный класс исключений как DataContract, а не использовать систему «Исключение» (или ее классы). –

0

Если вы вывода класса Exception, убедитесь, что ваш заказ исключение имеет конструктор сериализации

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