Поймать FaultException <TDetail>для любого исключения, полученного TDetail? - PullRequest
3 голосов
/ 07 июня 2011

Как мне перехватить FaultException для любого TDetail, полученного из исключений?
Я пробовал catch( FaultException<Exception> ) {}, но, похоже, это не работает.

Редактировать
Цель состоит вполучить доступ к свойству Detail.

Ответы [ 2 ]

8 голосов
/ 07 июня 2011

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

Отражение медленное, но так как исключения должны быть редкими ... опять же, я советую разбить их, как вы можете.

0 голосов
/ 26 октября 2015
catch (FaultException ex) 
{
    MessageFault fault = ex.CreateMessageFault();
    var objFaultContract = fault.GetDetail<Exception>();

    //you will get all attributes in objFaultContract
}
...