web-dev-qa-db-fra.com

C # - récupère le numéro de ligne qui a déclenché une exception

Dans un bloc catch, comment puis-je obtenir le numéro de ligne qui a généré une exception?

166
MBZ

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. 

231
Quartermeister

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.

48
SimpleButPerfect

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;
    }
}   
25
radbyx

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.

17
Darin Dimitrov

Ça marche:

var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
6

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();
2
Ram Maurya

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 #.

1
Joseph Michael

Méthode d'extension

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;
    }
}

Usage

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);
}
0
Arvo Bowen

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();
0
Sean Fleming