Pergunta

Este é provavelmente irrealista, mas seria possível habilitar um componente para ser notificado de todas as exceções de primeira chance que ocorrem em seu processo?

Temos alguns componentes que não conseguem fazer nada, mas comer excepitions de terceiros (contratados por nós) e a política da relação de negócios fazem todo o calvário uma dor real.

Nós também estamos cientes de que alguns dos nosso código está executando a ação decepcionante de deixar exceções desaparecer no abismo em vez de usar a nossa logger exceção centralizada.

Eu assumo a nossa aplicação teria de ser iniciado como um processo filho de um aplicativo de depuração para alcançar o efeito, mas eu acho que vale a pena perguntar:)

Foi útil?

Solução

Net 4.0 tem realmente adicionou o evento AppDomain.FirstChanceException . Ela dispara antes de qualquer bloco catch é executada.

Este MSDN artigo tem alguns exemplos.

Basicamente basta adicionar um manipulador de eventos como este:

    AppDomain.CurrentDomain.FirstChanceException += 
        (object source, FirstChanceExceptionEventArgs e) =>
        {
            Console.WriteLine("FirstChanceException event raised in {0}: {1}",
                AppDomain.CurrentDomain.FriendlyName, e.Exception.Message);
        };

Outras dicas

Você pode usar o .NET perfil de API para obter notificações de exceções em todos os tipos de estados, estes são os métodos disponíveis:

ExceptionThrown
ExceptionSearchFunctionEnter
ExceptionSearchFunctionLeave
ExceptionSearchFilterEnter
ExceptionSearchFilterLeave
ExceptionSearchCatcherFound
ExceptionOSHandlerEnter
ExceptionOSHandlerLeave
ExceptionUnwindFunctionEnter
ExceptionUnwindFunctionLeave
ExceptionUnwindFinallyEnter
ExceptionUnwindFinallyLeave
ExceptionCatcherEnter
ExceptionCatcherLeave
ExceptionCLRCatcherFound
ExceptionCLRCatcherExecute

Usando a API de perfil não é inteiramente para os fracos de coração; ter um olhar para http://msdn.microsoft.com/en-us/ biblioteca / ms404386.aspx como um ponto de entrada para a sua investigação e http : //msdn.microsoft.com/en-us/library/bb384687.aspx para manuseamento de excepção especificamente.

Eu não estou ciente de uma simples maneira de fazê-lo dentro de seu código gerenciado como

AppDomain.FirstChanceException += new EventHandler...

evento ou similar.

EDIT: Um possivelmente melhor alternativa é usar o unamanaged depuração API em seu lugar.

Basicamente, você pode definir um ICorManagedCallback / ICorManagedCallback2 callback usando ICorDebug :: SetManagedHandler e obter retornos de chamada quando ocorrem exceções.

Eu não sou suficientemente experiente nesta área para saber quais são as vantagens / desvantagens são sobre a api de perfil.

Eu só tinha um olhar para o mdgb amostra que utiliza as APIs ICorDebug e parece ser notificado suficiente de exceções (ver rapidamente o que ocorrer eventos, definir um ponto de interrupção no método HandleEvent em Corapi / Debugger.cs: 406)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top