Excepciones en WCF
Tal y como comentaba el vecino de blog Oskar, durante la charla que nos ofrecio en el grupo de usuarios del Pais Vasco, yo pregunte si era posible que la clase que proporcinabamos como tipo a la clase genérica FaultException derivase de la clase Exception. La motivación de esta pregunta está en poder manejar internamente al servcio o propagar excepciones desde el mismo usando la misma jerarquía de excepciones.
Tas investigar un poco más el tema he llegado a la conclusión de que no necesitamos que la clase que envolvemos en la clase genérica FaultException derive de Exception, tal y como yo proponia, porque FaultException ya deriva de Exception. De todos modos agredezco a Oskar que se molestase en buscar las solución a mi pregunta.
Creo que es mucho más lógico que tengamos una clase derivada de FaultException<> que podemos manejar como una excepción normal o como una excepción que propagamos por WCF si queremos.
Vamos que para soportar el escenario que yo planteaba lo que haría es declara una excepción que derive de FaultException<>
public class InvalidContactFault : FaultException<string>
{
public InvalidContactFault(string faultDetail):
base(faultDetail)
{
}
}
Lo que me permite lanzar una excepción y capturarla dentro de las fronteras del mismo servicio como cualquier otra excepción gracias a que FaultException deriva de Exception...
try
{
//Tras validar que el contacto no existe lanzamos una excepción
throw new InvalidContactFault("El contacto no exite");
}
//... que capturamos en la parte servidor del servicio
catch (InvalidContactFault ex)
{
//Podemos por ejemplo crear el contacto
//al vuelo en el servidor
}
o si preferimos podemos dejar que se propague hasta el cliente a través de los mecanismos de WCF y poder capturarla en el cliente y extraer la información del error que ocurrio en el servidor como es habitual:
try
{
proxy.GetContact(1);
}
catch (InvalidContactFault ex)
{
Console.WriteLine(ex.Detail);
}