Исключение FaultException <T>(), выданное службой, не перехватывается клиентским перехватом (FaultException <T>) - PullRequest
3 голосов
/ 13 июня 2010

Хорошо, я знаю, что что-то здесь упускаю.У меня есть следующий контракт операции:

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 (FaultException exp) (первый блок catch с ArgumentExceptionв коде клиента) блок не выполняется.Однако, когда я удаляю ArgumentException, чтобы иметь catch (FaultException exp), выполняется тот же самый блок catch.Я не уверен в этом, поскольку выкидываю исключение FaultException из своего контракта на эксплуатацию.Я что-то здесь упускаю.

Благодарим Вас за помощь, Ашиш

РЕДАКТИРОВАТЬ: - Когда я обновил ссылку на службу в моем клиенте, я смог поймать исключение FaultException<ArgumentException>.

Ответы [ 2 ]

3 голосов
/ 13 июня 2010

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

0 голосов
/ 09 августа 2011

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

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