2009-06-29 12 views

Odpowiedz

6

Możesz to zrobić tylko, jeśli masz dostępne symbole debugowania.

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

Jeśli chcesz debugować takiej sytuacji w VS, lepiej po prostu sprawdzić Thrown pole wyboru Common Language Runtime Exceptions w Exceptions okna znajduje się w Debug menu. Debugger zostanie przerwany zaraz po wygenerowaniu wyjątku, nawet jeśli znajduje się w bloku try.

+0

To jest poprawna odpowiedź. – Timwi

1

Można użyć 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

Należy jednak zwrócić uwagę, że spowoduje to zwrócenie informacji o klauzuli catch, a nie o tym, że wyjątek został zgłoszony, ponieważ należy sprawdzić zawartość właściwości StackTrace wyjątku, który został przechwycony! – jerryjvl

+0

Ta odpowiedź jest błędna, z przyczyn, o których wspomniał jerryjvl. Jak można to uznać za poprawne? – Timwi

1

Otóż w .NET masz Siema zwanego się FirstChanceException. Zasadniczo są one wysyłane przed rozpatrzeniem wyjątku. Istnieją dwa sposoby patrzenia na problem, który tu prezentujesz. Jeden pochodzi z kąta debugowania. W przypadku debugowania można ustawić debugger, aby przechwytywał wyrzucone wyjątki z okna Debug/Exceptions. Jest to łatwiejsze w kontekście interaktywnym. Jeśli trzeba nagrać tę informację od wewnątrz nieinterakcyjnym kontekście to chciałbym zrobić coś podobnego do tego, co mówi o CMS ...

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

Jedyną różnicą jest to, że mamy cały stos nazwiska, a następnie przejdź do pierwszej klatki, w której wyjątek został pierwotnie zgłoszony.

+0

Czy w ramce 0 nie ma miejsca, w którym powstał błąd? –

2

Osobiście po prostu rejestruję wartość zwracaną przez ToString() wyjątku. Cały ślad stosu jest dołączony. To jedna linia kodu ... martwa prosta.

Powiązane problemy