au moment de l'exécution, il n'y a pas de code source. à quoi sert cette ligne non? au moment du débogage, l'EDI montre clairement la ligne qui lève l'exception.
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{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();}
Notez que cela ne fonctionnera que si un fichier pdb est disponible pour l'assembly.
? (Nouveau StackTrace (ex, True)). GetFrame (0) .GetFileLineNumber () pour la ligne unique VB à partir de la fenêtre immédiate.
Jonathan
34
C # one liner:int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
gunwin
17
Cela renvoie toujours 0 pour moi. Est-ce dû au fait de ne pas avoir de fichier pdb? Qu'est-ce que c'est et comment l'obtenir? (J'utilise ASP.net)
Brabbeldas
17
Pourquoi utilisez-vous GetFrame (0)? Je pense que vous devriez utiliser GetFrame (FrameCount-1).
Dewald Swanepoel
9
J'ai trouvé que la suggestion d'utilisation de @DewaldSwanepoel GetFrame(st.FrameCount-1)était beaucoup plus fiable.
Brad Martin
75
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.
Eh bien MSDN pense différemment, qu'il « crée et retourne une représentation de chaîne de l'exception actuelle »: msdn.microsoft.com/en-us/library/...
Prokurors
Vous obtenez quelque chose de similaire à:System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Professeur de programmation
3
Cela devrait être la réponse acceptée. Je suis toujours allé pour ex.message et je me demandais pourquoi stupide VB.net ne pouvait pas obtenir les mêmes informations qu'en Java.
Matthis Kohli
3
C'est fou que cette réponse n'ait pas plus de votes positifs. C'est simple, fonctionne de manière fiable et ne vient pas avec les mises en garde PDB.
Malheureusement, ne fonctionnera pas dans un système d'exploitation non anglais (le mot "ligne" dépend du lieu).
Ivan Kochurkin
2
@KvanTTT Vous pouvez utiliser Regex.Matchavec :[^ ]+ (\d+)pour le même effet.
Dan Bechard
Cette réponse ne fonctionne pas pour moi, car ex.StackTrace n'en a pas :line et je n'ai pas le fichier PDB.
Warlike Chimpanzee
18
Vous pouvez inclure des .PDBfichiers 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.
Qu'en est-il des exceptions non gérées? comme UnhandledExceptionEventArgsobjet
Yousha Aleayoub
6
Vérifier celui-ci
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();
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 ",""));
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;}}
Usage
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();
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!
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 :
Notez que cela ne fonctionnera que si un fichier pdb est disponible pour l'assembly.
la source
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.
la source
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 #
Vb.net
Ou comme extensions sur la classe Exception
la source
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.la source
Ça marche:
la source
UnhandledExceptionEventArgs
objetVérifier celui-ci
la source
Mise à jour de la réponse
la source
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:
Cela fonctionne pour moi dans VS2017 C #.
la source
Méthode d'extension
Usage
la source
Travailler pour moi:
la source
J'ai ajouté une extension à Exception qui renvoie la ligne, la colonne, la méthode, le nom de fichier et le message:
la source
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!
la source