C # (não ASP / MVC / WinForms) - Captura todas as exceções em uma classe

Algumas informações de fundo

stou programando em um sistema que usa uma linguagem de programação proprietária, com a opção de usar classes .Net especialmente atribuídas no código proprietári

Infelizmente, o sistema não lida bem com exceções não tratadas que borbulham no código .Net, se é que não é; o sistema trava sem explicação. Isso é irritante, porque geralmente queremos lidar com exceções noproprietary system, não no código .Net. A solução oferecida pelo fornecedor do sistema é reembalar a exceção em um objeto especial que o sistemafa lidar com

Nosso código .Net é escrito em um padrão de fachada, e o problema é que, para garantir que todas as exceções resultantes do código .Net sejam tratadas, todos os métodos na fachada devem incluir um bloco try / catch que reembale as exceções que pode ocorrer

A questã

Eu li muitos tópicos aqui descrevendo cenários semelhantes, a maioria deles relacionados ao WinForms ou à Web. Como nosso código não é nenhum, a questão é se existe alguma maneira de capturar todas as exceções em uma classe, para que possamos reembalá-lo e reconfigurar uma versão modificada dele

bviamente, a interface entre as DLLs .Net que contêm as classes e a linguagem proprietária está completamente fora de nosso control

Edita

Eu tentei ocurrentDomain.UnhandledException método sugerido por @VMAtm, infelizmente sem sucesso. O manipulador de eventos não foi acionado, e o sistema pai conseguiu a exceção e depois se comportou mal como de costume. Isso me levou ao Google mais uma vez e achei este parágrafoaqu:

A primeira coisa a entender é que o evento UnhandledException não é um "manipulador" de exceção não tratada. O registro para o evento, ao contrário do que diz a documentação :-(, não faz com que exceções não tratadas sejam tratadas. (Desde então, elas não seriam tratadas, mas eu vou parar com o raciocínio circular já ...) The UnhandledException O evento simplesmente notifica que uma exceção não foi tratada, caso você queira tentar salvar o estado antes que seu thread ou aplicativo morr

Jonathan Keljo, Exceções do CLR PM

Isso foi muito ruim, gostei da ideia de ter um bloco de tentativa / captura "global". O que eu acho que isso significa é que não consigo ocultar a exceção do sistema pai. Desde que eu não sei a primeira coisa sobre como isso é implementado nesse sistema (e, francamente, eu não sei a primeira coisa sobre como eu iria implementá-lo eu mesmo), eu estou no gelo muito fino com o meu suposições, portanto, se alguém puder me corrigir de alguma forma, vá em frente!

Oh, o erro que estou recebendo no sistema pai éException has been thrown by the target of an invocation., até onde sei a mensagem da exceção .Net externa que está ocorrendo. Se é possível ler algo disso, eu não sei.

Vou experimentar o Castle Dynamic Proxy sugerido por @jlew também, mas parecia muito mais difícil do que as duas linhas do AppDomain e me assustou um pouco:)

Soluçã

Se você está tendo o mesmo problema que eu, tente ocurrentDomain.UnhandledException método sugerido pelo @VMAtm primeiro, porque é por causa do meu sistema pai ser especialmente anal que não funciono

Comecei a trabalhar usando a configuração do Castle DynamicProxy. Foi realmente muito fácil de configurar. Meu caso de teste era uma classe de fachada que encapsulava a classe XmlAttribute. A primeira coisa que tive que fazer foi escrever a classe proxy:

public class AttribInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        try
        {
            invocation.Proceed();
        }
        catch (Exception e)
        {
            // Custom exception repackaging here
        }
    }
}

Então eu tive que instruir o objeto de fachada para realmente usar o proxy. Eu mantive meu antigo campo de back-end, mas adicionei o seguinte ao c'tor:

public class CapXmlAttribute : CapPmlNetObject
{
    private XmlAttributeBackend _xmlAttribute;

    public CapXmlAttribute()
    {
        var generator = new ProxyGenerator();
        _xmlAttribute = (XmlAttributeBackend) generator.CreateClassProxy(
            typeof (XmlAttributeBackend), new AttribInterceptor());
    }
}

A última etapa foi definir todos os métodos no back-end expostos à fachada comovirtual. Isso não foi um problema para mim, mas pode ser um desastre para os outro

DynamicProxy realmente não é tão bom documentado, mas aprendi muito comKrzysztof Koźmic's tutorial eHamilton Verissimo's codeproject.

questionAnswers(3)

yourAnswerToTheQuestion