Tutorial :C# - get line number which threw exception



Question:

In a catch block, how can I get the line number which threw an exception?


Solution:1

If you need the line number for more than just the formatted stack trace you get from Exception.StackTrace, you can use the StackTrace class:

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

Note that this will only work if there is a pdb file available for the assembly.


Solution:2

Simple way, use the Exception.ToString() function, it will return the line after the exception description.

You can also check the program debug database as it contains debug info/logs about the whole application.


Solution:3

If you don't have the .PBO file:

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  

Or as an extentions on the Exception class

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;      }  }     


Solution:4

You could include .PDB symbol files associated to the assembly which contain metadata information and when an exception is thrown it will contain full information in the stacktrace of where this exception originated. It will contain line numbers of each method in the stack.


Solution:5

It works:

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


Solution:6

Check this one

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


Solution:7

Update to the answer

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


Solution:8

I tried using the solution By @davy-c but had an Exception "System.FormatException: 'Input string was not in a correct format.'", this was due to there still being text past the line number, I modified the code he posted and came up with:

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 ", ""));  

This works for me in VS2017 C#.


Solution:9

Extension Method

static class ExceptionHelpers  {      public static int LineNumber(this Exception 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;      }  }  

Usage

try  {      throw new Exception("A new error happened");  }  catch (Exception ex)  {      //If error in exception LineNumber() will be -1      System.Diagnostics.Debug.WriteLine("[" + ex.LineNumber() + "] " + ex.Message);  }  


Solution:10

In Global.resx file there is an event called Application_Error

it fires whenever an error occurs,,you can easily get any information about the error,and send it to a bug tracking e-mail.

Also i think all u need to do is to compile the global.resx and add its dll's (2 dlls) to your bin folder and it will work!


Solution:11

This works for me:

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

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »