FaultException () Exceção lançada pelo serviço não é capturada pela captura do cliente (FaultException )
-
27-09-2019 - |
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.
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) { }