Pregunta

Hay un constructor en StackTrace que toma una excepción como un argumento. Todo bien y bien, pero me di cuenta de que todos los demás constructores dicen que obtendrán el StackTrace del subproceso actual, pero que el constructor que toma la excepción no dice nada sobre eso excepto

  

El seguimiento de pila resultante describe   la pila en el momento de la   excepción.

Solo quiero estar seguro de que obtendré el StackTrace correcto de una excepción, incluso si creo el StackTrace en un hilo diferente en el que se creó la excepción cuando creo el StackTrace de una excepción en otro hilo.

¿Puede alguien confirmar?

¿Fue útil?

Solución

Parece bastante fácil de intentar, a menos que me esté perdiendo algo. Esto imprime el rastro de pila correcto para mí.

static Exception threadEx;

static void Main()
{
    Thread worker = new Thread(DoWork);
    worker.Start();
    worker.Join();

    if (threadEx != null) {
        StackTrace trace = new StackTrace(threadEx);
        Console.WriteLine(trace);
    }
}

static void DoWork()
{
    try {
        throw new Exception("Boom!");
    }
    catch (Exception ex) {
        threadEx = ex;
    }
}

Otros consejos

Creará el StackTrace para el hilo al que se llama (internamente, llama 'CaptureStackTrace' con el parámetro 'targetThread', que indica que se solicita el hilo actual). El único ctor que crea para otro hilo es el que toma una instancia de Thread.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top