2010-04-27 15 views
11

Possible en double: quelqu'un
Show line number in exception handlingGestion des exceptions - Afficher le numéro de la ligne où une erreur est survenue?

Peut-s'il vous plaît me dire comment obtenir le numéro de ligne du code où l'erreur est survenue et l'afficher à la console?

D'autres informations telles que le nom de fichier ou le nom de méthode seraient très utiles.

+0

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

Répondre

10

Vous pouvez imprimer toute trace de la pile à l'aide d'un try/catch autour du code qui peut jeter et en utilisant Console.WriteLine pour montrer l'objet d'exception:

try 
{ 
    new Program().Run(); 
} 
catch (Exception exception) // Prefer to catch a more specific execption. 
{ 
    Console.WriteLine(exception); 
} 

Sortie:

System.IndexOutOfRangeException: Index was outside the bounds of the array. 
    at Program.Run() in C:\Console Application1\Program.cs:line 37 
    at Program.Main(String[] args) in C:\Console Application1\Program.cs:line 45 

Le La première ligne indique le type de l'exception et le message. La deuxième ligne affiche le fichier, la fonction et le numéro de ligne où l'exception a été lancée. Vous pouvez également voir les emplacements des autres appels sur la pile d'appels dans les lignes suivantes.

Vous pouvez également obtenir des numéros de fichier et de ligne pour les exceptions non interceptées. Vous pouvez le faire en ajoutant un gestionnaire pour l'événement AppDomain.UncaughtException sur le AppDomain actuel:

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    new Program().Run(); 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Console.WriteLine(e.ExceptionObject); 
} 

Cela montre une sortie similaire à ci-dessus.

+0

Cela ne fonctionnera pas avec la classe MessageBox. –

2

Vous pouvez obtenir la trace de pile en accédant à Exception.StackTrace qui est une chaîne de caractères afin que vous puissiez l'imprimer sur la console en utilisant les méthodes Write ou WriteLine.

5
Console.WriteLine(exception.StackTrace); 

Assurez-vous que votre application est en mode Debug ou comprennent les symboles de débogage (le fichier .mdb) pour que les numéros de ligne apparaissent.

+5

En fait, vous avez besoin des * symboles de débogage * (le fichier .mdb) pour que les numéros de ligne apparaissent. La configuration de construction n'a rien à voir avec eux. –

+2

+1 pour indiquer le mode de débogage. – JasCav

+2

Le mode débogage n'est pas pertinent. –

0

Vous pouvez le trouver dans la trace de pile (Exception.StackTrace property), sur la dernière ligne, mais seulement lorsque votre code a été compilé avec les informations de débogage incluses. Sinon, le numéro de ligne sera inconnu.

14

Si vous voulez les numéros de fichier et de ligne, vous n'avez pas besoin d'analyser la chaîne StackTrace. Vous pouvez utiliser System.Diagnostics.StackTrace pour créer une trace de pile à partir d'une exception, avec ceci vous pouvez énumérer les cadres de pile et obtenir le nom de fichier, le numéro de ligne et la colonne que l'exception a été levée. Voici un exemple rapide et sale de la façon de le faire. Aucune vérification d'erreur incluse. Pour que cela fonctionne un PDB doit exister avec les symboles de débogage, ceci est créé par défaut avec la version de débogage.

using System; 
using System.Diagnostics; 
namespace ConsoleApplication1 
{ 
    class Program 
    {  
    static void Main(string[] args) 
    {  
     try 
     { 
     TestFunction(); 
     } 
     catch (Exception ex) 
     { 
     StackTrace st = new StackTrace(ex, true); 
     StackFrame[] frames = st.GetFrames(); 

     // Iterate over the frames extracting the information you need 
     foreach (StackFrame frame in frames) 
     { 
      Console.WriteLine("{0}:{1}({2},{3})", frame.GetFileName(), frame.GetMethod().Name, frame.GetFileLineNumber(), frame.GetFileColumnNumber()); 
     } 
     } 

     Console.ReadKey(); 
    } 

    static void TestFunction() 
    {  
     throw new InvalidOperationException(); 
    } 
    } 
} 

La sortie du code ci-dessus ressemble à ce

 
D:\Source\NGTests\ConsoleApplication1\Program.cs:TestFunction(30,7) 
D:\Source\NGTests\ConsoleApplication1\Program.cs:Main(11,9) 
+0

Ceci est un bon exemple. Les trames [0] ont-elles toujours la méthode, le numéro de ligne, le numéro de colonne et le nom de fichier? Au lieu de boucler les 20 images ou le nombre total, pouvons-nous juste assigner directement les valeurs telles que string lineNumber = frames [0] .GetFileLineNumber() – JoshYates1980

+1

@ JoshYates1980, le nom du fichier, la ligne et la colonne ne seront disponibles que si vous avez débogué info incluse. Vous pouvez accéder au cadre par index, bien sûr vous devriez vérifier que l'index auquel vous essayez d'accéder existe sinon vous obtiendrez une IndexOutOfRangeException. –