En un catch
bloque, ¿cómo puedo obtener el número de línea que arrojó una excepción?
En un catch
bloque, ¿cómo puedo obtener el número de línea que arrojó una excepción?
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 :
try
{
throw new Exception();
}
catch (Exception ex)
{
// Get stack trace for the exception with source file information
var st = new StackTrace(ex, true);
// Get the top stack frame
var frame = st.GetFrame(0);
// Get the line number from the stack frame
var line = frame.GetFileLineNumber();
}
Tenga en cuenta que esto solo funcionará si hay un archivo pdb disponible para el ensamblado.
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.
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#
public int GetLineNumber(Exception ex)
{
var lineNumber = 0;
const string lineSearch = ":line ";
var index = ex.StackTrace.LastIndexOf(lineSearch);
if (index != -1)
{
var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
if (int.TryParse(lineNumberText, out lineNumber))
{
}
}
return lineNumber;
}
Vb.net
Public Function GetLineNumber(ByVal ex As Exception)
Dim lineNumber As Int32 = 0
Const lineSearch As String = ":line "
Dim index = ex.StackTrace.LastIndexOf(lineSearch)
If index <> -1 Then
Dim lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length)
If Int32.TryParse(lineNumberText, lineNumber) Then
End If
End If
Return lineNumber
End Function
O como extensiones en la clase Excepción
public static class MyExtensions
{
public static int LineNumber(this Exception ex)
{
var lineNumber = 0;
const string lineSearch = ":line ";
var index = ex.StackTrace.LastIndexOf(lineSearch);
if (index != -1)
{
var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
if (int.TryParse(lineNumberText, out lineNumber))
{
}
}
return lineNumber;
}
}
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.
Funciona:
var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
UnhandledExceptionEventArgs
objeto
Revisa este
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();
Actualizar a la respuesta
// Get stack trace for the exception with source file information
var st = new StackTrace(ex, true);
// Get the top stack frame
var frame = st.GetFrame(st.FrameCount-1);
// Get the line number from the stack frame
var 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 ", ""));
Esto funciona para mí en VS2017 C #.
static class ExceptionHelpers
{
public static int LineNumber(this Exception 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;
}
}
try
{
throw new Exception("A new error happened");
}
catch (Exception ex)
{
//If error in exception LineNumber() will be -1
System.Diagnostics.Debug.WriteLine("[" + ex.LineNumber() + "] " + ex.Message);
}
Trabajando para mi
var st = new StackTrace(e, true);
// Get the bottom stack frame
var frame = st.GetFrame(st.FrameCount - 1);
// Get the line number from the stack frame
var line = frame.GetFileLineNumber();
var method = frame.GetMethod().ReflectedType.FullName;
var path = frame.GetFileName();
Agregué una extensión a Exception que devuelve la línea, columna, método, nombre de archivo y mensaje:
public static class Extensions
{
public static string ExceptionInfo(this Exception exception)
{
StackFrame stackFrame = (new StackTrace(exception, true)).GetFrame(0);
return string.Format("At line {0} column {1} in {2}: {3} {4}{3}{5} ",
stackFrame.GetFileLineNumber(), stackFrame.GetFileColumnNumber(),
stackFrame.GetMethod(), Environment.NewLine, stackFrame.GetFileName(),
exception.Message);
}
}
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á!