Stack Traces nuovamente comprensibili

Ops.. è passato un bel pò di tempo dal mio ultimo post su UGI.. lo sapevo! E' successo ancora! :)

FPGA, IoT, Elettronica varia e diversi progetti mi hanno tenuto occupato quanto basta ed aggiornare due blog (per chi non lo sapesse, potete seguirmi anche su http://electro-logic.blogspot.it) è abbastanza impegnativo. In realtà anche lato .NET non mi sono mai fermato (Xamarin, UWP, .NET Core, ...avrei tante tante cose da raccontare!)

Vediamo oggi come si è evoluta nel tempo la Stack Traces in C#, ovvero, semplificando molto, l'elenco cronologico delle chiamate di funzione che ci hanno portato ad una determinata situazione.

Sono ormai passati i tempi (.NET 1.0) dove si aveva uno Stack Trace immediatamente comprensibile come


Con l'aggiunta di nuove funzionalità come i Generics, LINQ, i metodi Lambda, Async, etc.. oggi ci troviamo sempre più spesso ad una situazione di questo tipo (se ci va bene):



Dove si riesce ancora a capire qualcosa, ma il tempo per avere una chiara visione di quello che sta succedendo aumenta inesorabilmente, se non altro per leggere delle informazioni spesso poco rilevanti e rifacenti a meccanismi interni che quasi mai hanno a che vedere coi problemi che come sviluppatori di applicativi (e non di framework) cerchiamo di risolvere.

Il progetto Ben.Demystifier (https://github.com/benaadams/Ben.Demystifier) nasce per riportare la semplicità anche nello Stack Trace, interpretando pattern complessi ma estremamente ripetitivi, conseguenza delle nuove funzioni di .NET, e rendendoli immediatamente comprensibili, rimuovendo così la noiosa ridondanza dai nostri log.

Ecco come diventa lo Stack Trace precedente:



E questo il codice (esempio in .NET Core 2.0, C# 7.2) per generarlo


Come è possibile notare l'utilizzo è immediato, basta chiamare l'Extension Method Demystify() sulle nostre eccezioni per avere una stringa.. demistificata. Veramente impressionante!

Ecco l'esempio dell'autore del progetto, ancora più incisivo, che potete trovare nella pagina principale del progetto:



Personalmente spero che venga in qualche modo direttamente integrato nel futuro .NET Core.
Per il momento utilizziamo la libreria tramite NuGet e diciamo addio a lunghe sessioni di Stack Trace Understanding.

Ciao a tutti!