Come ottenere il nome del metodo del codice .Net in esecuzione

I programmatori più anziani hanno fatto in tempo a conoscere un mondo senza IDE e breakpoint) ed erano (sono?) abituati ad andare a cercare i bug delle applicazioni piazzando nei punti strategici delle stesse delle stampe (a video e/o su carta) del tipo “Procedura X – Avvio”, “Procedura X – Calcolo Totale”, “Procedura X – Fine” e così via.

Normalmente la tecnica era molto più raffinata di come la descrivo: ad esempio, la stampa poteva essere subordinata ad un parametro dell’applicazione così da non apparire in produzione, ma solo in fase di debug; oppure poteva comprendere i valori delle variabili o di ritorno dalle funzioni e così via.

In ogni caso, questo era spesso l’unico modo per cercare di capire, in caso di errore, la zona del codice dove qualcosa poteva essere andato storto.

Visual Studio.NET, come i suoi predecessori e molti altri ambienti di sviluppo, permette di inserire dei breakpoint in determinati punti dell’applicazione così che l’esecuzione (purché lanciata dall’interno di Visual Studio, ovviamente) si interrompa consentendoci di interrogare il valore delle variabili e di proseguire passo a passo, nella speranza di trovare l’errore.

Purtroppo però vi sono circostanze in cui questo approccio non è sufficiente; per cominciare, l’ambiente di produzione è quasi sempre differente da quello di sviluppo / test per almeno tre variabili: utente, configurazione del sistema, set di dati. In questi casi si rende necessario ritornare al buon vecchio file di log per capire cosa ha fatto l’utente, in quale ambiente e con quali dati.

Non descriverò qui la creazione di un sistema di logging/tracing, ma mi limito a considerare che questo si basa su un presupposto: ogni riga di codice tracciata deve essere ricondotta in maniera univoca al metodo che l’ha generata: il metodo più semplice consiste(va) nel ripetere svariate volte nel codice istruzioni del tipo:

Console.Writeline("Sub X - 001")
....
Console.Writeline("Sub X - 002")

e così via…

Questo metodo però si basa su un uso sagace della funzionalità di “Copia & Incolla”: copio l’istruzione di WriteLine, modificando la stringa ogni volta che la incollo da qualche altra parte; essendo un’attività umana, è soggetta ad errori (lo posso assicurare…)

Il Framework .NET però ci viene in soccorso, usando la classe StackFrame contenuta nella namespace System.Diagnostic: questa classe consente, in qualunque punto dell’applicazione ci ritroviamo, di risalire lo stack di esecuzione per ottenere il nome del metodo in esecuzione, la classe cui appartiene il metodo e la namespace cui appartiene la classe; purtroppo però la classe consente di recuperare soltanto il nome ed il tipo dei parametri eventualmente passati al metodo, ma non il loro valore effettivo.

Public Function RunningContext() As String

    Dim result As String
    Dim sFrame As System.Diagnostics.StackFrame

    sFrame = New System.Diagnostics.StackFrame(1)
    result = sFrame.GetMethod().ReflectedType + "." + sFrame.GetMethod().Name + "()"

    Return result

End Function

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*