Respostas:
Dê uma olhada no System.Diagnostics
espaço para nome. Muitas guloseimas lá!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
É muito bom dar uma olhada para saber o que está acontecendo sob o capô.
Eu recomendo que você analise as soluções de log (como NLog, log4net ou os padrões e práticas da Microsoft Enterprise Library) que podem atingir seus objetivos e mais alguns. Boa sorte, meu caro!
Uma alternativa System.Diagnostics.StackTrace
é usar System.Environment.StackTrace, que retorna uma representação de seqüência de caracteres do stacktrace.
Outra opção útil é usar as variáveis de depuração$CALLER
e $CALLSTACK
no Visual Studio, pois isso pode ser ativado em tempo de execução sem reconstruir o aplicativo.
Environment.StackTrace
apenas novo é uma instância de StackTrace
.
System.Environment.StackTrace
pode ser uma maneira mais conveniente de acessar essas informações.
System.Diagnostics.StackTrace
- ver msdn.microsoft.com/en-us/library/...
Environment.StackTrace
sempre começa at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? Isso não faz parte do rastreamento de pilha atual, pois alguém está procurando por ele.
Existem duas maneiras de fazer isso. O System.Diagnostics.StackTrace()
vai lhe dar um rastreamento de pilha para o segmento atual. Se você tiver uma referência a uma Thread
instância, poderá obter o rastreamento de pilha para isso através da versão sobrecarregada de StackTrace()
.
Você também pode conferir a questão Stack Overflow. Como obter o stacktrace do thread não atual? .
Você também pode fazer isso no depurador do Visual Studio sem modificar o código.
Obviamente, isso não ajuda se você estiver executando o código em uma máquina diferente, mas pode ser bastante útil poder citar um rastreamento de pilha automaticamente sem afetar o código de liberação ou sem precisar reiniciar o programa.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
A saída será semelhante a:
em YourNamespace.Program.executeMethod (String msg)
em YourNamespace.Program.Main (String [] args)
Substitua Console.WriteLine
pelo seu Log
método. Na verdade, não há necessidade .ToString()
do caso Console.WriteLine, pois ele aceita
object
. Mas você pode precisar disso para o seu método Log (string msg).
private void ExceptionTest()
{
try
{
int j = 0;
int i = 5;
i = 1 / j;
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
var stList = ex.StackTrace.ToString().Split('\\');
Console.WriteLine("Exception occurred at " + stList[stList.Count() - 1]);
}
}
Parece funcionar para mim
StackTrace
é lento - use-o com moderação.