Respuestas:
Echa un vistazo al System.Diagnostics
espacio de nombres. Un montón de golosinas allí!
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Es realmente bueno tener un vistazo para saber qué sucede debajo del capó.
Le recomiendo que eche un vistazo a las soluciones de registro (como NLog, log4net o la Biblioteca Enterprise de patrones y prácticas de Microsoft) que pueden lograr sus propósitos y más. ¡Buena suerte compañero!
Una alternativa System.Diagnostics.StackTrace
es utilizar System.Environment.StackTrace, que devuelve una representación de cadena de stacktrace.
Otra opción útil es usar las variables de depuración$CALLER
y $CALLSTACK
en Visual Studio ya que esto se puede habilitar en tiempo de ejecución sin reconstruir la aplicación.
Environment.StackTrace
solo nuevo es una instancia de StackTrace
.
System.Environment.StackTrace
podría ser una forma más conveniente de acceder a esa información.
System.Diagnostics.StackTrace
- ver msdn.microsoft.com/en-us/library/…
Environment.StackTrace
siempre comienza at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo) at System.Environment.get_StackTrace()
? Eso no es parte del seguimiento de la pila actual, ya que alguien lo está buscando.
Hay dos maneras de hacer esto. El System.Diagnostics.StackTrace()
le dará un seguimiento de la pila para el hilo actual. Si tiene una referencia a una Thread
instancia, puede obtener el seguimiento de la pila a través de la versión sobrecargada deStackTrace()
.
También es posible que desee consultar la pregunta de desbordamiento de pila ¿ Cómo obtener el stacktrace de subprocesos no actuales? .
También puede hacer esto en el depurador de Visual Studio sin modificar el código.
Por supuesto, esto no ayuda si está ejecutando el código en una máquina diferente, pero puede ser bastante útil poder escupir un seguimiento de la pila automáticamente sin afectar el código de lanzamiento o incluso sin necesidad de reiniciar el programa.
Console.WriteLine(
new System.Diagnostics.StackTrace().ToString()
);
La salida será similar a:
en YourNamespace.Program.executeMethod (String msg)
en YourNamespace.Program.Main (String [] args)
Reemplace Console.WriteLine
con su Log
método. En realidad, no es necesario .ToString()
el caso Console.WriteLine como lo acepta
object
. Pero es posible que lo necesite para su 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 mi
StackTrace
es lento , así que úselo con moderación.