C# - 获取引发异常的行号

MBZ*_*MBZ 180 c# exception

在一个catch块中,我如何获得引发异常的行号?

Qua*_*ter 258

如果您需要的行号不仅仅是从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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,只有在可用于程序集的pdb文件时,这才有效.

  • C#one liner:`int line =(new StackTrace(ex,true)).GetFrame(0).GetFileLineNumber();` (29认同)
  • 你为什么使用GetFrame(0)?我认为你应该使用GetFrame(FrameCount-1). (14认同)
  • 这总是为我返回0.这是由于没有pdb文件引起的吗?它是什么以及如何获得它?(我使用的是ASP.net) (13认同)
  • 我发现@DewaldSwanepoel建议使用`GetFrame(st.FrameCount-1)`来提高可靠性. (7认同)
  • ?(New StackTrace(ex,True)).GetFrame(0).GetFileLineNumber()用于来自即时窗口的VB单行. (2认同)
  • 这将取决于您访问 `StackTrace` 的位置 - 如果您正在传递 *Exception*,那么 `.GetFrame(0)` 可能不准确。仅供参考。 (2认同)

Sim*_*ect 66

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

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

  • `Exception.Message`对我来说是死的。再也不。 (8认同)
  • 这应该是公认的答案.我总是去ex.message,并想知道为什么愚蠢的VB.net无法获得与Java相同的信息. (3认同)
  • 这个答案没有更多的赞成是疯狂的.这很简单,工作可靠,并没有PDB警告. (3认同)

rad*_*byx 25

如果您没有该.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;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

或者作为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;
    }
}   
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,在非英语操作系统中不起作用("行"字取决于语言环境). (8认同)
  • @KvanTTT你可以使用'Regex.Match`和`:[^] +(\ d +)`来获得相同的效果. (2认同)

Dar*_*rov 18

您可以包含.PDB与程序集关联的符号文件,其中包含元数据信息,并且在抛出异常时,它将包含此异常源自的堆栈跟踪中的完整信息.它将包含堆栈中每个方法的行号.


Thi*_*han 7

有用:

var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
Run Code Online (Sandbox Code Playgroud)


小智 5

检查这个

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();
Run Code Online (Sandbox Code Playgroud)