代码之家  ›  专栏  ›  技术社区  ›  MBZ

C-获取引发异常的行号

  •  168
  • MBZ  · 技术社区  · 14 年前

    在一个 catch block,如何获取引发异常的行号?

    11 回复  |  直到 6 年前
        1
  •  231
  •   Quartermeister    14 年前

    如果您需要的行号不仅仅是从exception.stack trace获得的格式化堆栈跟踪,那么可以使用 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文件时,这才有效。

        2
  •  50
  •   Otiel user577803    13 年前

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

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

        3
  •  25
  •   radbyx Matt    9 年前

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

    或者作为异常类的扩展

    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;
        }
    }   
    
        4
  •  17
  •   Darin Dimitrov    14 年前

    你可以包括 .PDB 与包含元数据信息的程序集关联的符号文件,当引发异常时,它将在该异常产生的位置的stacktrace中包含完整信息。它将包含堆栈中每个方法的行号。

        5
  •  6
  •   Alex    8 年前

    它的工作原理是:

    var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
    
        6
  •  2
  •   Rey    6 年前

    检查这个

    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();
    
        7
  •  1
  •   Patrice Gahide    6 年前

    我尝试使用@davy-c的解决方案,但有一个例外:“system.formatException:'输入字符串的格式不正确'”,这是因为仍有文本超过行号,我修改了他发布的代码,并得出了:

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

    这在VS2017 C中对我有效。

        8
  •  0
  •   Sean Fleming    9 年前

    更新到答案

        // 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();
    
        9
  •  0
  •   Arvo Bowen    6 年前

    扩展方法

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

    用法

    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);
    }
    
        10
  •  -3
  •   Khaled    14 年前

    在global.resx文件中有一个名为application_error的事件

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

    另外,我认为你所需要做的就是编译global.resx并将它的dll(2个dll)添加到你的bin文件夹中,它就可以工作了!

        11
  •  -19
  •   2bob    11 年前

    这对我很有用:

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