Domanda

Questo è probabilmente poco realistico, ma sarebbe possibile attivare un componente ricevere una notifica di tutte le prime eccezioni di possibilità che si verificano nel suo processo?

Abbiamo alcuni componenti che non riescono a fare altro che mangiare excepitions e la politica del rapporto d'affari rendere l'intera prova un dolore reale di terze parti (contratto da noi).

Siamo anche consapevoli del fatto che alcuni dei nostro codice sta eseguendo l'azione deludente di lasciare eccezioni svaniscono nel baratro piuttosto che utilizzare il nostro logger un'eccezione centralizzata.

I assumere la nostra applicazione avrebbe dovuto essere avviato come un processo figlio di un'applicazione di debug per ottenere l'effetto, ma immagino vale la pena chiedere:)

È stato utile?

Soluzione

Net 4.0 è in realtà ha aggiunto l'evento AppDomain.FirstChanceException . Spara prima che venga eseguita qualsiasi blocco catch.

MSDN articolo ha alcuni esempi.

In pratica si aggiunge solo un gestore di eventi in questo modo:

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

Altri suggerimenti

È possibile utilizzare l'API .NET profiling per ottenere le notifiche di eccezioni a tutti i tipi di stati, questi sono i metodi disponibili:

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

utilizzando l'API di profiling non è del tutto per i deboli di cuore; dare un'occhiata alla http://msdn.microsoft.com/en-us/ biblioteca / ms404386.aspx come punto di ingresso per la vostra ricerca e http : //msdn.microsoft.com/en-us/library/bb384687.aspx per la gestione delle eccezioni in particolare.

Io non sono a conoscenza di un modo semplice per farlo all'interno del codice gestito come

AppDomain.FirstChanceException += new EventHandler...

evento o simili.

EDIT: Un possibilmente migliore alternativa utilizza il unamanaged debug API invece.

In sostanza è possibile impostare un ICorManagedCallback / ICorManagedCallback2 richiamata utilizzando ICorDebug :: SetManagedHandler e ottenere callback quando si verificano eccezioni.

Non ho abbastanza esperienza in questo settore per sapere quali sono i vantaggi / svantaggi sono oltre l'API profiling.

Ho appena avuto uno sguardo al > mdgb campione che utilizza le API ICorDebug e sembra ottenere abbastanza sufficiente di notifiche da eccezioni (vedere rapidamente quali eventi si verificano, impostare un punto di interruzione nel metodo handleEvent in Corapi / Debugger.cs: 406)

scroll top