2010-04-27 11 views
11

Eventuali duplicati:
Show line number in exception handlingGestione delle eccezioni - Visualizza il numero di riga in cui si è verificato un errore?

qualcuno può dirmi come ottenere il numero di riga del codice in cui si è verificato l'errore e visualizzarlo sulla console?

Altre informazioni come il nome del file o il nome del metodo sarebbero molto utili.

+0

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

risposta

10

È possibile stampare l'intero stack trace utilizzando un try/catch attorno al codice che può lanciare e quindi utilizzando Console.WriteLine per mostrare l'oggetto eccezione:

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

uscita:

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 

Il la prima riga mostra il tipo di eccezione e il messaggio. La seconda riga mostra il file, la funzione e il numero di riga in cui è stata generata l'eccezione. Puoi anche vedere le posizioni di altre chiamate sullo stack di chiamate nelle seguenti righe.

È inoltre possibile ottenere i numeri di file e di riga per le eccezioni non rilevate. Si può fare questo con l'aggiunta di un gestore per l'evento AppDomain.UncaughtException sul AppDomain corrente:

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

Questo dimostra un'uscita simile al precedente.

+0

Questo non funzionerà con la classe MessageBox. –

2

È possibile ottenere la traccia dello stack accedendo a Exception.StackTrace che è una stringa in modo che sia possibile stamparlo sulla console utilizzando i metodi Write o WriteLine.

5
Console.WriteLine(exception.StackTrace); 

assicurarsi che l'applicazione è in modalità Debug o includere i simboli di debug (file mdb) al fine di numeri di riga a comparire.

+5

In realtà, è necessario il * simbolo di debug * (il file .mdb) per visualizzare i numeri di riga. La configurazione di build non ha nulla a che fare con loro. –

+2

+1 per indicare la modalità di debug. – JasCav

+2

La modalità di debug è irrilevante. –

0

È possibile trovarlo nella traccia stack (Exception.StackTrace property), sull'ultima riga, ma solo quando il codice è stato compilato con le informazioni di debug incluse. Altrimenti il ​​numero di linea sarà sconosciuto.

14

Se si desidera il numero di file e di riga, non è necessario analizzare la stringa StackTrace. È possibile utilizzare System.Diagnostics.StackTrace per creare una traccia dello stack da un'eccezione, con questo è possibile enumerare i frame dello stack e ottenere il nome file, il numero di riga e la colonna in cui è stata sollevata l'eccezione. Ecco un esempio veloce e sporco di come farlo. Nessun controllo degli errori incluso. Affinchè questo funzioni un PDB deve esistere con i simboli di debug, questo viene creato di default con il debug build.

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

L'output del codice di cui sopra appare così

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

Questo è un ottimo esempio. I fotogrammi [0] hanno sempre il metodo, il numero di riga, il numero di colonna e il nome del file? Invece di eseguire il ciclo di tutti i 20 frame o il conteggio totale, possiamo semplicemente assegnare direttamente i valori come string lineNumber = frames [0] .GetFileLineNumber() – JoshYates1980

+1

@ JoshYates1980, il nome del file, la riga e la colonna saranno disponibili solo se hai il debug informazioni incluse Puoi accedere al frame per indice, ovviamente dovresti controllare che l'indice a cui stai tentando di accedere esista altrimenti otterrai una IndexOutOfRangeException. –