C# – 获取exception的行号

catch块中,我怎样才能得到抛出exception的行号?

如果您需要的行号不只是从Exception.StackTrace获得的格式化堆栈跟踪,则可以使用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(); } 

请注意,只有在程序集有可用的pdb文件时才能使用。

简单的方法,使用Exception.ToString()函数,它会在exception描述之后返回行。

您还可以检查程序debugging数据库,因为它包含有关整个应用程序的debugging信息/日志。

如果您没有.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 

或者作为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; } } 

您可以包含与包含元数据信息的程序集相关联的.PDB符号文件,并且在引发exception时,将包含发生此exception的堆栈跟踪中的完整信息。 它将包含堆栈中每个方法的行号。

有用:

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

更新到答案

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

检查这一个

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

在Global.resx文件中有一个名为Application_Error的事件

它会在发生错误时触发,您可以轻松获取有关错误的任何信息,并将其发送到错误跟踪电子邮件。

另外我想所有你需要做的是编译global.resx,并将其DLL(2个DLL)添加到您的bin文件夹,它将工作!

你也可以得到行号

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

eException

这适用于我:

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