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);
e
是Exception
这适用于我:
try { //your code; } catch(Exception ex) { MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message); }