为任何Exception派生的TDetail?</tdetail>捕获FaultException <tdetail>

时间:2011-06-07 18:00:38

标签: .net wcf .net-4.0 faultexception

如何为任何Exception派生的TDetail捕获FaultException?
我试过catch( FaultException<Exception> ) {},但这似乎不起作用。

修改
目的是获得对Detail属性的访问权。

2 个答案:

答案 0 :(得分:8)

FaultException<>继承自FaultException。所以将代码更改为:

catch (FaultException fx)  // catches all your fault exceptions
{
    ...
}

===编辑===

如果你需要FaultException<T>.Detail,你有几个选择,但没有一个是友好的。最好的解决方案是捕获您想要捕获的每种类型:

catch (FaultException<Foo> fx) 
{
    ...
}
catch (FaultException<Bar> fx) 
{
    ...
}
catch (FaultException fx)  // catches all your other fault exceptions
{
    ...
}

我建议你这样做。否则,你将陷入反思。

try
{
    throw new FaultException<int>(5);
}
catch (FaultException ex)
{
    Type exType = ex.GetType();
    if (exType.IsGenericType && exType.GetGenericTypeDefinition().Equals(typeof(FaultException<>)))
    {
        object o = exType.GetProperty("Detail").GetValue(ex, null);
    }
}

反思很慢,但由于异常应该是罕见的......我再次建议将它们分解出去。

答案 1 :(得分:0)

catch (FaultException ex) 
{
    MessageFault fault = ex.CreateMessageFault();
    var objFaultContract = fault.GetDetail<Exception>();

    //you will get all attributes in objFaultContract
}