w czasie wykonywania nie ma kodu źródłowego. do czego ta linia nie będzie używana? w czasie debugowania IDE wyraźnie pokazuje linię, która zgłasza wyjątek.
Jeśli potrzebujesz numeru wiersza do więcej niż tylko sformatowanego śledzenia stosu uzyskanego z Exception.StackTrace, możesz użyć klasy StackTrace :
try{thrownewException();}catch(Exception ex){// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(0);// Get the line number from the stack framevar line = frame.GetFileLineNumber();}
Zauważ, że zadziała to tylko wtedy, gdy dla zestawu dostępny jest plik pdb.
Otrzymasz coś podobnego do:System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Profesora programowania
3
To powinna być zaakceptowana odpowiedź. Zawsze szukałem np. Wiadomości i zastanawiałem się, dlaczego głupie VB.net nie jest w stanie uzyskać takich samych informacji jak w Javie.
Matthis Kohli,
3
To szalone, że ta odpowiedź nie ma więcej pozytywnych opinii. Jest to proste, działa niezawodnie i nie jest objęte zastrzeżeniami PDB.
Nick Painter
9
Exception.Messagejest dla mnie martwy. Nigdy więcej.
Niestety nie będzie działać w systemie operacyjnym innym niż angielski (słowo „linia” zależy od ustawień regionalnych).
Ivan Kochurkin
2
@KvanTTT Możesz użyć Regex.Matchz :[^ ]+ (\d+)tym samym efektem.
Dan Bechard
Ta odpowiedź nie działa dla mnie, ponieważ ex.StackTrace nie ma :line i nie mam pliku PDB.
Warlike Chimpanzee
18
Możesz dołączyć .PDBpliki symboli powiązane ze złożeniem, które zawierają informacje o metadanych, a kiedy zgłoszony zostanie wyjątek, będzie on zawierał pełne informacje w ścieżce stosu, z której pochodzi ten wyjątek. Będzie zawierać numery linii każdej metody na stosie.
Co z nieobsługiwanymi wyjątkami? jak UnhandledExceptionEventArgsobiekt
Yousha Aleayoub
6
Sprawdź ten
StackTrace st =newStackTrace(ex,true);//Get the first stack frameStackFrame frame = st.GetFrame(0);//Get the file namestring fileName = frame.GetFileName();//Get the method namestring methodName = frame.GetMethod().Name;//Get the line number from the stack frameint line = frame.GetFileLineNumber();//Get the column numberint col = frame.GetFileColumnNumber();
// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();
Próbowałem użyć rozwiązania By @ davy-c, ale miałem wyjątek „System.FormatException:„ Łańcuch wejściowy nie był w poprawnym formacie. ””, Było to spowodowane tym, że nadal był tekst po numerze linii, zmodyfikowałem kod on opublikował i wymyślił:
int line =Convert.ToInt32(objErr.ToString().Substring(objErr.ToString().IndexOf("line")).Substring(0, objErr.ToString().Substring(objErr.ToString().IndexOf("line")).ToString().IndexOf("\r\n")).Replace("line ",""));
staticclassExceptionHelpers{publicstaticintLineNumber(thisException ex){int n;int i = ex.StackTrace.LastIndexOf(" ");if(i >-1){string s = ex.StackTrace.Substring(i +1);if(int.TryParse(s,out n))return n;}return-1;}}
Stosowanie
try{thrownewException("A new error happened");}catch(Exception ex){//If error in exception LineNumber() will be -1System.Diagnostics.Debug.WriteLine("["+ ex.LineNumber()+"] "+ ex.Message);}
var st =newStackTrace(e,true);// Get the bottom stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();var method = frame.GetMethod().ReflectedType.FullName;var path = frame.GetFileName();
W pliku Global.resx znajduje się zdarzenie o nazwie Błąd_aplikacji
uruchamia się za każdym razem, gdy wystąpi błąd ,, możesz łatwo uzyskać wszelkie informacje o błędzie i wysłać je na e-mail śledzenia błędów.
Myślę też, że wszystko, co musisz zrobić, to skompilować plik global.resx i dodać jego biblioteki DLL (2 biblioteki DLL) do folderu bin i będzie działać!
Odpowiedzi:
Jeśli potrzebujesz numeru wiersza do więcej niż tylko sformatowanego śledzenia stosu uzyskanego z Exception.StackTrace, możesz użyć klasy StackTrace :
Zauważ, że zadziała to tylko wtedy, gdy dla zestawu dostępny jest plik pdb.
źródło
int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
GetFrame(st.FrameCount-1)
aby była bardziej niezawodna.Prosto, użyj
Exception.ToString()
funkcji, zwróci wiersz po opisie wyjątku.Możesz także sprawdzić bazę danych debugowania programu, ponieważ zawiera informacje / dzienniki debugowania dotyczące całej aplikacji.
źródło
System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Exception.Message
jest dla mnie martwy. Nigdy więcej.Jeśli nie masz
.PBO
pliku:DO#
Vb.net
Lub jako rozszerzenie klasy Exception
źródło
Regex.Match
z:[^ ]+ (\d+)
tym samym efektem.:line
i nie mam pliku PDB.Możesz dołączyć
.PDB
pliki symboli powiązane ze złożeniem, które zawierają informacje o metadanych, a kiedy zgłoszony zostanie wyjątek, będzie on zawierał pełne informacje w ścieżce stosu, z której pochodzi ten wyjątek. Będzie zawierać numery linii każdej metody na stosie.źródło
To działa:
źródło
UnhandledExceptionEventArgs
obiektSprawdź ten
źródło
Zaktualizuj odpowiedź
źródło
Próbowałem użyć rozwiązania By @ davy-c, ale miałem wyjątek „System.FormatException:„ Łańcuch wejściowy nie był w poprawnym formacie. ””, Było to spowodowane tym, że nadal był tekst po numerze linii, zmodyfikowałem kod on opublikował i wymyślił:
Działa to dla mnie w VS2017 C #.
źródło
Metoda przedłużenia
Stosowanie
źródło
Pracuje dla mnie:
źródło
Dodałem rozszerzenie do wyjątku, które zwraca wiersz, kolumnę, metodę, nazwę pliku i komunikat:
źródło
W pliku Global.resx znajduje się zdarzenie o nazwie Błąd_aplikacji
uruchamia się za każdym razem, gdy wystąpi błąd ,, możesz łatwo uzyskać wszelkie informacje o błędzie i wysłać je na e-mail śledzenia błędów.
Myślę też, że wszystko, co musisz zrobić, to skompilować plik global.resx i dodać jego biblioteki DLL (2 biblioteki DLL) do folderu bin i będzie działać!
źródło