W dotNet linia zgłasza wyjątek i zostaje przechwycona, jak mogę ustalić, w której linii plik wyrzucił wyjątek? Wydaje się stosunkowo proste, ale nie mogę tego rozgryźć ...Ustalenie, która linia kodu wyrzuciła wyjątek
Odpowiedz
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
.
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;
}
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
Ta odpowiedź jest błędna, z przyczyn, o których wspomniał jerryjvl. Jak można to uznać za poprawne? – Timwi
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.
Czy w ramce 0 nie ma miejsca, w którym powstał błąd? –
Osobiście po prostu rejestruję wartość zwracaną przez ToString() wyjątku. Cały ślad stosu jest dołączony. To jedna linia kodu ... martwa prosta.
- 1. Jak sprawdzić, która linia kodu VBA powoduje błędy
- 2. Ustalenie, która suma kontrolna jest używana
- 3. Co może zrobić ta linia kodu JavaScript?
- 4. Co oznacza ta linia kodu JQuery?
- 5. Ustalenie ćwiartkę punktu
- 6. Ustalenie, czy wątek śpi
- 7. Jak sprawdzić, która linia pliku plist jest niepoprawna
- 8. C# Numer Wyjątek linia jest zawsze zero (0)
- 9. Jak wrócić do linii kodu, która rzuciła wyjątek w debugerze Visual Studio 2010?
- 10. Która część mojego kodu MATLAB jest wielowątkowa?
- 11. Uproszczenie kodu Pythona? Jedna linia, dodać wszystko w liście
- 12. Django szablon kodowanie przerwa linia styl przez długi wiersz kodu
- 13. Ustalenie które przeciążać został wybrany
- 14. Ustalenie, czy zmienna znajduje się w zasięgu?
- 15. Ustalenie, czy punkt znajduje się wewnątrz geometrii
- 16. matplotlib linia 2d linia, działka = przecinek oznaczający
- 17. Zgłoszona linia Git
- 18. Jak uzyskać stronę, która rzuciła wyjątek do Application_error w aspx
- 19. Weird wątku wyjątek NullReferenceException podczas czytania wartość, która istnieje?
- 20. Jak mogę się dowiedzieć, która procedura spowodowała wyjątek w Delphi?
- 21. Wyjątek dla tablicy, która nie ulega rozkładowi na wskaźnik?
- 22. Dlaczego Lambda Java, która zgłasza wyjątek Runtime, wymaga nawiasów?
- 23. Ustalenie, czy ciąg znaków zawiera datę i godzinę
- 24. Ustalenie dostępną przestrzeń sterty na aktywność (OutOfMemoryException zapobiegania)
- 25. Dlaczego ta linia powoduje wyjątek VerificationException podczas działania w środowisku .NET 4?
- 26. Linia podświetlenia na flotdzie
- 27. linia dziennika Lager obcięty
- 28. Android Spannable Linia Wysokość
- 29. Rails 3 zignorować wyjątek wyjątek wyjątek Postgres
- 30. Ustalenie, czy liczba jest potęgą 2
To jest poprawna odpowiedź. – Timwi