Em linguagens baseadas em exceções, stack traces são uma das ferramentas mais importantes para diagnosticar um problema. Em muitos casos, uma breve mensagem de erro e o stack trace são as únicas informações disponíveis para o desenvolvedor. Especialmente quando o PII (Personably Identifiable Information), limitam o que pode ser registrado.
Como o advento do Task Parallel Library (TPL), e, depois, do async/await, stack traces ficaram cada vez mais difíceis de entender. Não é incomum que as informações úteis estejam ocultas entre várias ocorrências de:
E esta, efetivamente, é uma das melhorias. Antes do .NET 4.5 e da adoção da classe ExceptionDispatchInfo, stack traces não podiam ultrapassar os limites de assincronismo e, em vez disso, os desenvolvedores teriam que investigar por meios de exceções internas. Mas muito mais pode ser feito.
O desenvolvedor de jogos da empresa Illyriad, Bem Adams, tomou para si a tarefa de melhorar o stack trace do .NET Core 2.1. Ele trabalhou focado nas seguintes áreas:
- Remover as interferências introduzidas pelos pontos de chamadas async/await.
- Exibir qual método de sobrecarga foi chamado durante um async ou iterator context.
Enquanto isso, Anirudh Agnihotry atualizou o KeyNotFoundException utilizado pelo Dictionary/ConcurrentDicTionary para apontar qual chave não foi encontrada, um incômodo para desenvolvedores .NET desde a versão 1.0.
Se você estiver no framework .NET ou não gostaria de esperar pelo .NET Core 2.1, você ainda pode se beneficiar do trabalho do Ben usando a biblioteca Bem.Demystifier. Essa biblioteca contém alterações que vão além das que ele fez no .NET Core e faz com que a leitura da stack trace seja mais próximo do código C# original. (Essa não era uma opção do .NET Core, já que mostram palavras-chave C# em um stack trace VB ou F# não seria muito útil).
.NET Core é publicado com a licença MIT. Bem.Demystifier está disponível sob a licença Apache.