2009-06-29 19 views

risposta

6

Puoi farlo solo se disponi di simboli di debug.

catch(Exception ex) { 
    // check the ex.StackTrace property 
} 

Se si desidera eseguire il debug una situazione del genere in VS, è meglio che semplicemente controllare Thrown casella di controllo Common Language Runtime Exceptions in Exceptions finestra situata in Debug menu. Il debugger si interromperà non appena viene lanciata l'eccezione, anche se si trova in un blocco try.

+0

Questa è la risposta corretta. – Timwi

1

è possibile utilizzare il StackFrame Class:

try 
{ 
    ... 
    ... 

} 
catch(...) 
{ 
    StackFrame sf = new StackFrame(true); 

    int lineNumber = sf.GetFileLineNumber(); 
    int colNumber = sf.GetFileColumnNumber(); 
    string fileName = sf.GetFileName(); 
    string methodName = sf.GetMethod().Name; 
} 
+4

Nota che ciò restituirà le informazioni per la clausola 'catch' ... non dove è stata lanciata l'eccezione, per questo devi controllare il contenuto della proprietà 'StackTrace' dell'eccezione che hai catturato! – jerryjvl

+0

Questa risposta è sbagliata, per le ragioni che jerryjvl ha affermato. Come può essere accettato come corretto? – Timwi

1

Beh, in .NET si dispone di che cosa è chiamato un FirstChanceException. Questi essenzialmente vengono lanciati prima che venga gestita un'eccezione. Ci sono due modi per esaminare il problema che stai presentando qui. Uno è da un angolo di debug. Se si esegue il debug, è possibile impostare il debugger in modo che rilevi le eccezioni generate dalla finestra Debug/Exceptions. Questo è più semplice in un contesto interattivo. SE avete bisogno di registrare queste informazioni all'interno di un contesto non interattivo poi vorrei fare qualcosa di simile a ciò che CMS sta parlando ...

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(ex); 
    System.Diagnostics.StackFrame firstFrame = stackTrace.GetFrame[0]; 
    Console.WriteLine(firstFrame.GetFileLineNumber); 
    ... 
} 

L'unica differenza è che si ottiene l'intero dello stack, quindi vai al primo frame, che è dove originariamente era stata lanciata l'eccezione.

+0

Non è il frame 0 il metodo corrente del frame, non il punto in cui è stato generato l'errore? –

2

Personalmente, registro solo il valore restituito da ToString() dell'eccezione. L'intera traccia dello stack è inclusa. È una linea di codice ... semplice e semplice.

Problemi correlati