2010-07-25 10 views
139

W bloku catch, w jaki sposób mogę uzyskać numer wiersza, który rzucił wyjątek?C# - pobierz numer linii, który wyrzucił wyjątek

+0

przy starcie 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. – ankitjaininfo

+0

możliwy duplikat [obsługi wyjątków - wyświetla numer wiersza, w którym wystąpił błąd?] (Http: // stackoverflow.com/questions/2723607/exception-handling-display-line-number-where-error-occurred) –

+0

możliwy duplikat [Show line number in exception handling] (http://stackoverflow.com/questions/688336/show-line -number-in-exception-handling) –

Odpowiedz

191

Jeśli potrzebujesz numer wiersza dla więcej niż tylko sformatowany ślad stosu można uzyskać z Exception.StackTrace, można użyć klasy StackTrace:

try 
{ 
    throw new Exception(); 
} 
catch (Exception ex) 
{ 
    // Get stack trace for the exception with source file information 
    var st = new StackTrace(ex, true); 
    // Get the top stack frame 
    var frame = st.GetFrame(0); 
    // Get the line number from the stack frame 
    var line = frame.GetFileLineNumber(); 
} 

Zauważ, że to będzie działać tylko wtedy, gdy istnieje PDB plik dostępny dla zespołu.

+2

? (Nowy StackTrace (ex, True)) GetFrame (0) .GetFileLineNumber() dla pojedynczej linii VB z bezpośredniego okna. – Jonathan

+19

C# one liner: 'int line = (nowy StackTrace (ex, true)). GetFrame (0) .GetFileLineNumber();' – gunwin

+8

To zawsze zwraca 0 dla mnie. Czy jest to spowodowane brakiem pliku pdb? Co to jest i jak to zdobyć? (Używam ASP.net) – Brabbeldas

14

Można dołączyć pliki symboli .PDB powiązane ze złożeniem, które zawierają informacje o metadanych, a po zgłoszeniu wyjątku będą zawierały pełne informacje w stosie, w którym powstał ten wyjątek. Będzie zawierał numery linii każdej metody w stosie.

29

Prosty sposób, użyj funkcji Exception.ToString(), zwróci wiersz po opisie wyjątku.

Możesz także sprawdzić programową bazę danych debugowania, ponieważ zawiera informacje/informacje dotyczące debugowania dotyczące całej aplikacji.

+0

Cóż MSDN myśli inaczej, że "Tworzy i zwraca ciąg znaków reprezentujący bieżący wyjątek": http://msdn.microsoft.com/en-us/library/system.exception. tostring (v = vs.110) .aspx – Prokurors

+0

Otrzymujesz coś podobnego do: 'System.Exception: Test w Tests.Controllers.HomeController.About() w c: \ Users \ MatthewB \ Documents \ Visual Studio 2013 \ Projects \ Tests \ Tests \ Controllers \ HomeController.cs: line 22' –

+1

To powinna być zaakceptowana odpowiedź. Zawsze szukałem ex.message i zastanawiałem się, dlaczego głupi VB.net nie jest w stanie uzyskać tych samych informacji, co w Javie. –

-3

W pliku Global.resx nie jest wydarzeniem o nazwie Application_Error

pożary gdy wystąpi błąd ,, można łatwo uzyskać wszelkie informacje na temat błędu i wysłać go do śledzenia błędów e-mail.

Również myślę, że wszystko, co musisz zrobić, to skompilować plik global.resx i dodać jego biblioteki DLL (2 biblioteki DLL) do folderu bin, a to zadziała!

+1

Ehm, masz na myśli ** Global. ASAX' **, prawda? –

-6

Można również uzyskać numer wiersza przez

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

gdzie e jest Exception

+9

-1 Nie jestem pewna, czy to działa? StackTrace to ciąg znaków, który może zawierać od 0 do n znaków. W jaki sposób Twój kod zapewnia wiarygodne dane wyjściowe? – Jacques

+0

@Jacques Działa dobrze, jeśli 1) numer linii jest obecny w StackTrace, a 2) numer linii ma dwie cyfry. Oba są okropnymi założeniami. – Dan

-19

Działa to dla mnie:

try 
{ 
    //your code; 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message); 
} 
+0

ex.Message nie trzyma numeru wiersza ... – Prokurors

+3

To jest całkowicie niewiarygodne –

+0

dobry żart, @ 2bob – devi

4

Działa:

var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber(); 
24

Jeśli nie masz plik .PBO:

C#

public int GetLineNumber(Exception ex) 
{ 
    var lineNumber = 0; 
    const string lineSearch = ":line "; 
    var index = ex.StackTrace.LastIndexOf(lineSearch); 
    if (index != -1) 
    { 
     var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length); 
     if (int.TryParse(lineNumberText, out lineNumber)) 
     { 
     } 
    } 
    return lineNumber; 
} 

VB.NET

Public Function GetLineNumber(ByVal ex As Exception) 
    Dim lineNumber As Int32 = 0 
    Const lineSearch As String = ":line " 
    Dim index = ex.StackTrace.LastIndexOf(lineSearch) 
    If index <> -1 Then 
     Dim lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length) 
     If Int32.TryParse(lineNumberText, lineNumber) Then 
     End If 
    End If 
    Return lineNumber 
End Function 

lub jako rozserzenia na klasy Exception

public static class MyExtensions 
{ 
    public static int LineNumber(this Exception ex) 
    { 
     var lineNumber = 0; 
     const string lineSearch = ":line "; 
     var index = ex.StackTrace.LastIndexOf(lineSearch); 
     if (index != -1) 
     { 
      var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length); 
      if (int.TryParse(lineNumberText, out lineNumber)) 
      { 
      } 
     } 
     return lineNumber; 
    } 
} 
+7

Niestety nie będzie działać w nie angielskim systemie operacyjnym (słowo "linia" zależy od ustawień regionalnych). –

+2

@KvanTTT Możesz użyć 'Regex.Match' z': [^] + (\ d +) 'dla tego samego efektu. – Dan

0

Update do odpowiedź

// Get stack trace for the exception with source file information 
    var st = new StackTrace(ex, true); 
    // Get the top stack frame 
    var frame = st.GetFrame(st.FrameCount-1); 
    // Get the line number from the stack frame 
    var line = frame.GetFileLineNumber(); 
2

Sprawdź ten

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