en tiempo de ejecución no hay código fuente. ¿Para qué se utilizará esta línea? en el momento de la depuración, el IDE muestra claramente la línea que arroja una excepción.
Si necesita el número de línea para algo más que el seguimiento de pila formateado que obtiene de Exception.StackTrace, puede usar la clase StackTrace :
try{thrownewException();}catch(Exception ex){// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(0);// Get the line number from the stack framevar line = frame.GetFileLineNumber();}
Tenga en cuenta que esto solo funcionará si hay un archivo pdb disponible para el ensamblado.
Bueno, MSDN piensa de manera diferente, que "Crea y devuelve una representación de cadena de la excepción actual": msdn.microsoft.com/en-us/library/…
Prokurors
Obtienes algo similar a:System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Profesor de programación el
3
Esta debería ser la respuesta aceptada. Siempre elegí ex.message y me pregunté por qué el estúpido VB.net no puede obtener la misma información que en Java.
Matthis Kohli
3
Es una locura que esta respuesta no tenga más votos a favor. Esto es simple, funciona de manera confiable y no viene con las advertencias de PDB.
Lamentablemente no funcionará en un sistema operativo que no esté en inglés (la palabra "línea" depende del entorno local)
Ivan Kochurkin
2
@KvanTTT Se puede usar Regex.Matchcon :[^ ]+ (\d+)el mismo efecto.
Dan Bechard
Esta respuesta no me funciona, ya que, por ejemplo, StackTrace no tiene :line y no tengo el archivo PDB.
Chimpancé guerrero
18
Puede incluir .PDBarchivos de símbolos asociados al ensamblaje que contengan información de metadatos y cuando se lanza una excepción, contendrá información completa en el stacktrace de dónde se originó esta excepción. Contendrá números de línea de cada método en la pila.
¿Qué pasa con las excepciones no manejadas? como UnhandledExceptionEventArgsobjeto
Yousha Aleayoub
6
Revisa este
StackTrace st =newStackTrace(ex,true);//Get the first stack frameStackFrame frame = st.GetFrame(0);//Get the file namestring fileName = frame.GetFileName();//Get the method namestring methodName = frame.GetMethod().Name;//Get the line number from the stack frameint line = frame.GetFileLineNumber();//Get the column numberint col = frame.GetFileColumnNumber();
// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();
Intenté usar la solución By @ davy-c pero tuve una excepción "System.FormatException: 'La cadena de entrada no estaba en un formato correcto'", esto se debía a que todavía había texto más allá del número de línea, modifiqué el código. publicado y se le ocurrió:
int line =Convert.ToInt32(objErr.ToString().Substring(objErr.ToString().IndexOf("line")).Substring(0, objErr.ToString().Substring(objErr.ToString().IndexOf("line")).ToString().IndexOf("\r\n")).Replace("line ",""));
staticclassExceptionHelpers{publicstaticintLineNumber(thisException ex){int n;int i = ex.StackTrace.LastIndexOf(" ");if(i >-1){string s = ex.StackTrace.Substring(i +1);if(int.TryParse(s,out n))return n;}return-1;}}
Uso
try{thrownewException("A new error happened");}catch(Exception ex){//If error in exception LineNumber() will be -1System.Diagnostics.Debug.WriteLine("["+ ex.LineNumber()+"] "+ ex.Message);}
var st =newStackTrace(e,true);// Get the bottom stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();var method = frame.GetMethod().ReflectedType.FullName;var path = frame.GetFileName();
En el archivo Global.resx hay un evento llamado Application_Error
se activa cada vez que se produce un error, puede obtener fácilmente cualquier información sobre el error y enviarlo a un correo electrónico de seguimiento de errores.
¡También creo que todo lo que necesita hacer es compilar global.resx y agregar sus dll (2 dlls) a su carpeta bin y funcionará!
Respuestas:
Si necesita el número de línea para algo más que el seguimiento de pila formateado que obtiene de Exception.StackTrace, puede usar la clase StackTrace :
Tenga en cuenta que esto solo funcionará si hay un archivo pdb disponible para el ensamblado.
fuente
int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
GetFrame(st.FrameCount-1)
es mucho más confiable.De manera simple, use la
Exception.ToString()
función, devolverá la línea después de la descripción de la excepción.También puede consultar la base de datos de depuración del programa, ya que contiene información / registros de depuración sobre toda la aplicación.
fuente
System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Exception.Message
está muerto para mí Nunca más.Si no tienes el
.PBO
archivo:C#
Vb.net
O como extensiones en la clase Excepción
fuente
Regex.Match
con:[^ ]+ (\d+)
el mismo efecto.:line
y no tengo el archivo PDB.Puede incluir
.PDB
archivos de símbolos asociados al ensamblaje que contengan información de metadatos y cuando se lanza una excepción, contendrá información completa en el stacktrace de dónde se originó esta excepción. Contendrá números de línea de cada método en la pila.fuente
Funciona:
fuente
UnhandledExceptionEventArgs
objetoRevisa este
fuente
Actualizar a la respuesta
fuente
Intenté usar la solución By @ davy-c pero tuve una excepción "System.FormatException: 'La cadena de entrada no estaba en un formato correcto'", esto se debía a que todavía había texto más allá del número de línea, modifiqué el código. publicado y se le ocurrió:
Esto funciona para mí en VS2017 C #.
fuente
Método de extensión
Uso
fuente
Trabajando para mi
fuente
Agregué una extensión a Exception que devuelve la línea, columna, método, nombre de archivo y mensaje:
fuente
En el archivo Global.resx hay un evento llamado Application_Error
se activa cada vez que se produce un error, puede obtener fácilmente cualquier información sobre el error y enviarlo a un correo electrónico de seguimiento de errores.
¡También creo que todo lo que necesita hacer es compilar global.resx y agregar sus dll (2 dlls) a su carpeta bin y funcionará!
fuente