FaultException () Exceção lançada pelo serviço não é capturada pela captura do cliente (FaultException )

StackOverflow https://stackoverflow.com/questions/3032303

Pergunta

Ok, eu sei que estou perdendo alguma coisa aqui. Eu tenho o seguinte contrato de operação:

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;
}

E a seguir é retirado do cliente:-

  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());
  }

No caso acima, o Catch (FaultException exp) (o primeiro bloco de captura com o argumentoException no código do cliente) não é executado. No entanto, quando removo o argumentException para ter captura (FaultException exp), o mesmo bloco de captura é executado. Não tenho certeza disso, pois estou lançando FaultException do meu contrato de operação. Estou perdendo qualquer coisa aqui.

Aprecie sua ajuda, Ashish

Editar:- Quando atualizei a referência de serviço em meu cliente, pude capturar o FaultException<ArgumentException> exceção.

Foi útil?

Solução

Experimente com FaultException<DataContract> Para algum tipo de contrato de dados arbitrários. Se você olhar para o código gerado para a falha na aula de proxy, aposto que você verá que o ArgumentException não está serializando a maneira como você espera.

Outras dicas

Se você estiver derivando a classe de exceção, verifique se sua exceção personalizada tem o construtor de serialização

protected MyCustomException(
          SerializationInfo info,
          StreamingContext context)
            : base(info, context) { }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top