2009-03-27 13 views
17

¿Cómo se mostraría qué número de línea causó el error y esto es posible con la forma en que .NET compila sus .exes?Mostrar el número de línea en el manejo de excepciones

Si no, ¿existe una forma automática de Exception.Message para mostrar el sub que se eliminó?

try 
{ 
    int x = textbox1.Text; 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+0

¿Cómo se compila ese código? –

+5

no lo acabo de hacer para mostrar como un ejemplo – Crash893

+0

posible duplicado http://stackoverflow.com/questions/8338495/how-to-get-error-line-number-of-code-using-try-catch –

Respuesta

44

Usa ex.ToString() para obtener el seguimiento completo de la pila.

Debe compilar con símbolos de depuración (archivos .pdb), incluso en modo de lanzamiento, para obtener los números de línea (esta es una opción en las propiedades de compilación del proyecto).

+3

+1 para archivos PDB y números de línea –

+1

Si es un proyecto web y desea implementar pdbs en el servidor, en las opciones del proyecto en la sección Paquete/Publicar web, desmarque "Excluir símbolos de depuración generados". –

+0

¿Alguien puede aclarar sobre "compilar con símbolos de depuración"? Mi proyecto tiene 'Definir constante DEBUG', 'Definir constante TRACE' e 'Información de depuración: completa', y no obtengo los números de línea. MSDN dice: "haga clic en la pestaña Generar en el panel izquierdo de la página de propiedades, luego seleccione las casillas de verificación para la configuración del compilador que desea habilitar. Desactive las casillas de verificación de la configuración que desea deshabilitar." Útil. – omJohn8372

4

Si usa 'StackTrace' e incluye los archivos .pdb en el directorio de trabajo, el seguimiento de la pila debe contener números de línea.

25

Para ver la StackTrace una excepción dado, utilizar e.StackTrace

Si necesita información más detallada, puede utilizar la clase System.Diagnostics.StackTrace (aquí hay un código para probar):

try 
{ 
    throw new Exception(); 
} 
catch (Exception ex) 
{ 
    //Get a StackTrace object for the exception 
    StackTrace st = new StackTrace(ex, true); 

    //Get the first stack frame 
    StackFrame frame = st.GetFrame(0); 

    //Get the file name 
    string fileName = frame.GetFileName(); 

    //Get the method name 
    string methodName = frame.GetMethod().Name; 

    //Get the line number from the stack frame 
    int line = frame.GetFileLineNumber(); 

    //Get the column number 
    int col = frame.GetFileColumnNumber(); 
} 

Esto solo funcionará si hay un archivo pdb disponible para el ensamblaje. Vea las propiedades del proyecto - pestaña de compilación - Avanzado - Selección de información de depuración para asegurarse de que hay un archivo pdb.

+0

¿Por qué obtendrías el primer marco de pila? ¿No preferirías estar interesado en el último marco de pila? es decir, StackFrame frame = st.GetFrame (st.FrameCount - 1) –

+0

Intenté usar esto en un servicio web de WCF y el número de línea que devuelve es siempre 0. Esto está en modo de depuración con el archivo .pdb presente. –

1
string lineNumber=e.StackTrace.Substring(e.StackTrace.Length - 7, 7); 
Cuestiones relacionadas