2010-04-27 10 views

Respuesta

10

Puede imprimir todo el seguimiento de la pila mediante el uso de un try/catch alrededor del código que puede lanzar y luego usando Console.WriteLine para mostrar el objeto de excepción:

try 
{ 
    new Program().Run(); 
} 
catch (Exception exception) // Prefer to catch a more specific execption. 
{ 
    Console.WriteLine(exception); 
} 

Salida:

System.IndexOutOfRangeException: Index was outside the bounds of the array. 
    at Program.Run() in C:\Console Application1\Program.cs:line 37 
    at Program.Main(String[] args) in C:\Console Application1\Program.cs:line 45 

El La primera línea muestra el tipo de la excepción y el mensaje. La segunda línea muestra el archivo, la función y el número de línea donde se lanzó la excepción. También puede ver las ubicaciones de otras llamadas en la pila de llamadas en las siguientes líneas.

También puede obtener números de archivo y línea para excepciones no detectadas. Usted puede hacer esto mediante la adición de un controlador para el evento AppDomain.UncaughtException en el dominio de aplicación actual:

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    new Program().Run(); 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Console.WriteLine(e.ExceptionObject); 
} 

Esto muestra una salida similar a la anterior.

+0

Esto no funcionará con la clase MessageBox. –

2

Puede obtener el seguimiento de la pila accediendo a Exception.StackTrace que es una cadena para que pueda imprimirla en la consola utilizando los métodos Write o WriteLine.

5
Console.WriteLine(exception.StackTrace); 

Asegúrese de que su aplicación está en modo de Debug o la inclusión de los símbolos de depuración (el archivo .mdb) Para que los números de línea que aparezcan.

+5

En realidad, necesita los * símbolos de depuración * (el archivo .mdb) para que aparezcan los números de línea. La configuración de compilación no tiene nada que ver con ellos. –

+2

+1 para señalar el modo de depuración. – JasCav

+2

El modo de depuración es irrelevante. –

0

Puede encontrarlo en el seguimiento de la pila (Exception.StackTrace property), en la última línea, pero solo cuando su código haya sido compilado con la información de depuración incluida. De lo contrario, el número de línea será desconocido.

14

Si desea los números de archivo y línea, no necesita analizar la cadena StackTrace. Puede usar System.Diagnostics.StackTrace para crear un seguimiento de pila a partir de una excepción, con esto puede enumerar los marcos de pila y obtener el nombre de archivo, el número de línea y la columna donde se generó la excepción. Aquí hay un ejemplo rápido y sucio de cómo hacer esto. Sin verificación de errores incluida. Para que esto funcione, debe existir un PDB con los símbolos de depuración, esto se crea de manera predeterminada con la creación de depuración.

using System; 
using System.Diagnostics; 
namespace ConsoleApplication1 
{ 
    class Program 
    {  
    static void Main(string[] args) 
    {  
     try 
     { 
     TestFunction(); 
     } 
     catch (Exception ex) 
     { 
     StackTrace st = new StackTrace(ex, true); 
     StackFrame[] frames = st.GetFrames(); 

     // Iterate over the frames extracting the information you need 
     foreach (StackFrame frame in frames) 
     { 
      Console.WriteLine("{0}:{1}({2},{3})", frame.GetFileName(), frame.GetMethod().Name, frame.GetFileLineNumber(), frame.GetFileColumnNumber()); 
     } 
     } 

     Console.ReadKey(); 
    } 

    static void TestFunction() 
    {  
     throw new InvalidOperationException(); 
    } 
    } 
} 

La salida del código anterior es el siguiente

 
D:\Source\NGTests\ConsoleApplication1\Program.cs:TestFunction(30,7) 
D:\Source\NGTests\ConsoleApplication1\Program.cs:Main(11,9) 
+0

Este es un gran ejemplo. ¿Los marcos [0] siempre tienen el método, número de línea, número de columna y nombre de archivo? En lugar de recorrer los 20 fotogramas o el recuento total, ¿podemos asignar directamente los valores tales como string lineNumber = frames [0] .GetFileLineNumber() – JoshYates1980

+1

@ JoshYates1980, el nombre de archivo, la línea y la columna solo estarán disponibles si tiene depuración información incluida Puede acceder al cuadro por índice; por supuesto, debe verificar que exista el índice al que intenta acceder, de lo contrario obtendrá IndexOutOfRangeException. –

Cuestiones relacionadas