Dans un catch
bloc, comment puis-je obtenir le numéro de ligne qui a levé une exception?
Dans un catch
bloc, comment puis-je obtenir le numéro de ligne qui a levé une exception?
Réponses:
Si vous avez besoin du numéro de ligne pour plus que la trace de pile formatée que vous obtenez d'Exception.StackTrace, vous pouvez utiliser la classe 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();
}
Notez que cela ne fonctionnera que si un fichier pdb est disponible pour l'assembly.
int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
GetFrame(st.FrameCount-1)
était beaucoup plus fiable.
De manière simple, utilisez la Exception.ToString()
fonction, 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 sur l'ensemble de l'application.
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 mort pour moi. Plus jamais.
Si vous n'avez pas le .PBO
fichier:
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 extensions sur la classe 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;
}
}
Regex.Match
avec :[^ ]+ (\d+)
pour le même effet.
:line
et je n'ai pas le fichier PDB.
Vous pouvez inclure des .PDB
fichiers de symboles associés à l'assembly qui contiennent des informations de métadonnées et lorsqu'une exception est levée, elle contiendra des informations complètes dans la trace de pile de l'origine de cette exception. Il contiendra les numéros de ligne de chaque méthode de la pile.
Ça marche:
var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
UnhandledExceptionEventArgs
objet
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();
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();
J'ai essayé d'utiliser la solution By @ davy-c mais j'ai eu une exception "System.FormatException: 'La chaîne d'entrée n'était pas dans un format correct.'", Cela était dû au fait qu'il y avait encore du texte après le numéro de ligne, j'ai modifié le code qu'il 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);
}
Travailler pour moi:
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();
J'ai ajouté une extension à Exception qui renvoie la ligne, la colonne, la méthode, le nom de fichier et le message:
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);
}
}
Dans le fichier Global.resx, il y a un événement appelé Application_Error
il se déclenche chaque fois qu'une erreur se produit, vous pouvez facilement obtenir des informations sur l'erreur et l'envoyer à un e-mail de suivi des bogues.
Je pense aussi que tout ce que vous devez faire est de compiler le global.resx et d'ajouter ses dll (2 dll) à votre dossier bin et cela fonctionnera!