2009-03-27 10 views
17

Comment afficher le numéro de ligne qui a provoqué l'erreur et est-ce possible avec la façon dont .NET compile ses .exes?Afficher le numéro de ligne dans la gestion des exceptions

Si ce n'est pas le cas, Exception.Message a-t-il un moyen automatisé d'afficher le sous-système qui a été supprimé?

try 
{ 
    int x = textbox1.Text; 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+0

Comment ce code peut-il même être compilé? –

+5

il ne fait pas que je l'ai fait pour montrer comme exemple – Crash893

+0

duplicata possible http://stackoverflow.com/questions/8338495/how-to-get-error-line-number-of-code-using-try-catch –

Répondre

44

Utilisez ex.ToString() pour obtenir la trace complète de la pile.

Vous devez compiler avec les symboles de débogage (fichiers .pdb), même en mode édition, pour obtenir les numéros de ligne (ceci est une option dans les propriétés de construction du projet).

+3

+1 pour les fichiers PDB et les numéros de ligne –

+1

S'il s'agit d'un projet Web et que vous souhaitez déployer des pdbs sur le serveur - dans les options de projet de la section Package/Publier Web, décochez la case "Exclure les symboles de débogage générés". –

+0

Quelqu'un peut-il fournir des précisions sur "compiler avec des symboles de débogage"? Mon projet a 'Définir la constante DEBUG', 'Définir la constante TRACE' et 'Informations de débogage: plein', et je ne reçois pas les numéros de ligne. MSDN indique, "cliquez sur l'onglet Générer dans le volet gauche de la page de propriétés, puis activez les cases à cocher pour les paramètres de compilateur que vous souhaitez activer. Désactivez les cases à cocher pour les paramètres que vous souhaitez désactiver." Utile. – omJohn8372

4

Si vous utilisez 'StackTrace' et que vous incluez les fichiers .pdb dans le répertoire de travail, la trace de pile doit contenir des numéros de ligne.

25

Pour voir l'stacktrace pour une exception donnée, utilisez e.StackTrace

Si vous avez besoin de plus amples informations, vous pouvez utiliser la classe System.Diagnostics.StackTrace (est un code ici pour vous d'essayer):

try 
{ 
    throw new Exception(); 
} 
catch (Exception ex) 
{ 
    //Get a StackTrace object for the exception 
    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(); 
} 

Cela ne fonctionnera que s'il existe un fichier pdb disponible pour l'assembly. Voir les propriétés du projet - onglet construire - Avancé - Sélection des informations de débogage pour s'assurer qu'il existe un fichier pdb.

+0

Pourquoi auriez-vous le premier cadre de pile? Ne préféreriez-vous pas être intéressé par le dernier cadre de pile? c'est-à-dire StackFrame frame = st.GetFrame (st.FrameCount - 1) –

+0

J'ai essayé d'utiliser ceci dans un service Web WCF et le numéro de ligne qu'il renvoie est toujours 0. C'est en mode débogage avec le fichier .pdb présent. –

1
string lineNumber=e.StackTrace.Substring(e.StackTrace.Length - 7, 7); 
Questions connexes