2009-03-27 7 views
17

Come si può visualizzare quale numero di riga ha causato l'errore ed è anche possibile con il modo in cui .NET compila i suoi .exes?Mostra il numero di riga nella gestione delle eccezioni

In caso contrario, c'è un modo automatico per Eccezione. Messaggio per visualizzare il sottotitolo che è saltato fuori?

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

Come si compila anche il codice? –

+5

non mi sono appena inventato per mostrare come esempio – Crash893

+0

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

risposta

44

Usa ex.ToString() per ottenere la traccia stack completo.

È necessario compilare con simboli di debug (file .pdb), anche in modalità di rilascio, per ottenere i numeri di riga (questa è un'opzione nelle proprietà di creazione del progetto).

+3

+1 per file PDB e numeri di linea –

+1

Se si tratta di un progetto Web e si desidera distribuire pdbs sul server, nelle opzioni di progetto nella sezione Pacchetto/pubblicazione Web deselezionare "Escludi simboli di debug generati". –

+0

Qualcuno può fornire chiarimenti su "compilazione con simboli di debug"? Il mio progetto ha 'Definisci costante DEBUG', 'Definisci costante TRACE' e 'Debug info: full', e non ricevo numeri di linea. MSDN dice "fai clic sulla scheda Costruisci nel riquadro sinistro della pagina delle proprietà, quindi seleziona le caselle di controllo per le impostazioni del compilatore che desideri attivare. Cancella le caselle di controllo per le impostazioni che vuoi disabilitare." Utile. – omJohn8372

4

Se si utilizza 'StackTrace' e si includono i file .pdb nella directory di lavoro, la traccia di stack deve contenere numeri di riga.

25

Per vedere lo stacktrace per un dato eccezione, utilizzare e.StackTrace

Se avete bisogno di informazioni più dettagliate, è possibile utilizzare la classe System.Diagnostics.StackTrace (qui è un codice per provare):

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

Questo funzionerà solo se è disponibile un file pdb per l'assembly. Vedi le proprietà del progetto - scheda build - Avanzate - Selezione informazioni di debug per assicurarti che ci sia un file pdb.

+0

Perché dovresti ottenere il primo frame dello stack? Non preferiresti essere interessato all'ultimo frame dello stack? ovvero Frame StackFrame = st.GetFrame (st.FrameCount - 1) –

+0

Ho provato a utilizzarlo in un servizio Web WCF e il numero di riga restituito è sempre 0. Si trova in modalità di debug con il file .pdb presente. –

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