Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Gestione delle eccezioni nell'API di profilatura

Le notifiche di eccezioni sono le più difficili da descrivere e da capire tra tutte le notifiche. In questo argomento viene descritta l’elaborazione delle eccezioni e viene spiegato come l’API di analisi gestisce i diversi tipi di eccezioni.

L'elaborazione delle eccezioni è intrinsecamente complessa. Le notifiche delle eccezioni descritte in questo argomento forniscono tutte le informazioni richieste da un sofisticato profiler per tenere traccia del passaggio (fase di ricerca o fase di rimozione), del frame, del filter e del blocco finally eseguito per ogni thread nel processo profilato. Le notifiche delle eccezioni non forniscono ThreadID, ma è possibile chiamare il metodo ICorProfilerInfo::GetCurrentThreadID per individuare quale thread gestito ha generato l'eccezione.

Nella figura seguente viene illustrato in quale modo il Code Profiler riceve i diversi callback quando esegue il monitoraggio degli eventi di eccezione. Ogni thread inizia nello stato di esecuzione normale. Quando il thread è in uno stato all’interno del sistema di eccezioni (nella fase di ricerca o nella fase di rimozione), viene controllato dal sistema per le eccezioni. Qualsiasi callback non correlato all'eccezione (ad esempio, ICorProfilerCallback::ObjectAllocated) che si verifica mentre il thread è in uno di questi stati può essere attribuito al sistema per le eccezioni stesso. Quando il thread è in uno stato al di fuori del sistema di eccezioni, sta eseguendo un codice gestito arbitrario.



Sequenza dei callback di eccezione

Sequenza di callback delle eccezioni Sequenza di callback delle eccezioni

I thread che hanno incontrato un codice gestito durante l'elaborazione di un'eccezione hanno generato un'altra eccezione che comporterebbe un passaggio del tutto nuovo della gestione delle eccezioni. (Questo nuovo passaggio viene indicato come "Nuovo passaggio della gestione delle eccezioni" nella figura precedente). Se tale eccezione annidata ignora i blocchi filter/finally/catch dell'eccezione originale, ciò può influire sull'eccezione originale nel modo seguente:

  • Se l'eccezione annidata si verifica all'interno di un blocco filter e ignora il blocco filter, il filter restituirà false e il primo passaggio continuerà.

  • Se l'eccezione annidata si verificasse all'interno di un blocco finally e ignorasse il blocco finally, l'elaborazione dell’eccezione originale non riprenderà mai.

  • Se l'eccezione annidata si verificasse all'interno di un blocco catch e ignorasse il blocco catch, l'elaborazione dell’eccezione originale non riprenderà mai.

Un'eccezione può essere gestita in codice non gestito. In questo caso, il profiler vedrà la fase di rimozione, ma non riceverà le notifiche dei gestori catch. L'esecuzione semplicemente riprenderà normalmente nel codice non gestito. Un profiler che supporta il codice non gestito sarà in grado di rilevare questa situazione, ma un profiler solo gestito potrà vedere qualsiasi cosa, compresi, senza limitazione, gli elementi seguenti:

  • Un callback di ICorProfilerCallback::UnmanagedToManagedTransition quando il codice non gestito chiama o ritorna a codice gestito.

  • Terminazione di un thread (se il codice non gestito fosse alla radice del thread).

  • Chiusura di un’applicazione (se il codice non gestito chiude l'applicazione).

Un'eccezione potrebbe essere gestita dallo stesso Common Language Runtime (CLR). In questo caso, il profiler vedrà la fase di rimozione, ma non riceverà le notifiche dei gestori catch. Può vedere il ripristino normale dell'esecuzione in codice gestito o non gestito.

Per impostazione predefinita, un'eccezione non gestita comporta l'arresto dei processi in .NET Framework versione 2.0. È possibile forzare il rispetto dei criteri relativi alle eccezioni di .NET Framework versione 1 utilizzando un flag compatibilità dell'applicazione, come descritto in Eccezioni in thread gestiti.

Mostra: