Dans un bloc catch
, comment puis-je obtenir le numéro de ligne qui a généré une exception?
Si vous avez besoin du numéro de ligne pour plus que la trace de pile formatée obtenue dans Exception.StackTrace, vous pouvez utiliser la classe StackTrace class:
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();
}
Notez que cela ne fonctionnera que si un fichier pdb est disponible pour l'assembly.
De manière simple, utilisez la fonction Exception.ToString()
, elle renverra la ligne après la description de l’exception.
Vous pouvez également vérifier la base de données de débogage du programme, car elle contient des informations/journaux de débogage concernant l'ensemble de l'application.
Si vous n'avez pas le fichier .PBO
:
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
Ou comme une extension de la classe d'exception
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;
}
}
Vous pouvez inclure des fichiers de symboles .PDB
associés à l'assembly, qui contiennent des informations de métadonnées. Lorsqu'une exception est générée, elle contient des informations complètes dans le stacktrace d'où provient cette exception. Il contiendra les numéros de ligne de chaque méthode dans la pile.
Ça marche:
var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
Vérifier celui-ci
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();
J'ai essayé d'utiliser la solution de @ davy-c mais j'avais une exception "System.FormatException: 'La chaîne d'entrée n'était pas dans un format correct.'" posté et est venu avec:
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 ", ""));
Cela fonctionne pour moi dans 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);
}
Mise à jour de la réponse
// 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();