C# 在异常处理中显示行号

C# 在异常处理中显示行号,c#,.net,exception,exception-handling,line-numbers,C#,.net,Exception,Exception Handling,Line Numbers,如何显示导致错误的行号,以及.NET编译其.EXE的方式是否可能出现这种情况 如果没有,是否有一种自动的方法来显示异常消息,以显示出报废的sub try { int x = textbox1.Text; } catch(Exception ex) { MessageBox.Show(ex.Message); } 使用ex.ToString()获取完整堆栈跟踪 即使在发布模式下,您也必须使用调试符号(.pdb文件)进行编译,以获取行号(这是项目生成属性中的一个选项)。如果在工作目录

如何显示导致错误的行号,以及.NET编译其.EXE的方式是否可能出现这种情况

如果没有,是否有一种自动的方法来显示异常消息,以显示出报废的sub

try
{
  int x = textbox1.Text;
}
catch(Exception ex)
{
     MessageBox.Show(ex.Message);
}
使用
ex.ToString()
获取完整堆栈跟踪


即使在发布模式下,您也必须使用调试符号(.pdb文件)进行编译,以获取行号(这是项目生成属性中的一个选项)。

如果在工作目录中使用并包含.pdb文件,堆栈跟踪应包含行号。

要查看给定异常的堆栈跟踪,请使用

如果需要更详细的信息,可以使用该类(这里有一些代码供您尝试):


只有当部件有可用的pdb文件时,此操作才有效。请参阅项目属性-生成选项卡-高级-调试信息选择,以确保存在pdb文件。

这样,您可以从异常获取行号

string lineNumber=e.StackTrace.Substring(e.StackTrace.Length - 7, 7);
public int GetLineNumber(Exception ex)
{

    const string lineSearch = ":line ";
    var index = ex.StackTrace.LastIndexOf(lineSearch);
    int ln=0;
    if (index != -1)
    {


        var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
        string lnum = System.Text.RegularExpressions.Regex.Match(lineNumberText, @"\d+").Value;
        int.TryParse(lnum,out ln);

    }
    return ln;
}

如果生成异常的库使用调试符号编译,则行号将包含在堆栈跟踪中。这可以是单独的文件(*.pdb)或嵌入到库中

对于.NET Core、.NET 5及更高版本,要在发布版本中具有完整的异常行号,请按以下方式配置项目:


真的
嵌入的
上面的配置将包括直接与生成文件一起使用的调试符号,这些文件可以作为NUGET发布

上述方法的一种替代方法是将调试包与主nuget包一起还原,这目前尚不受支持:

现在获取异常行号:

试试看
{
抛出新异常();
}
捕获(例外情况除外)
{
//使用源文件信息获取异常的堆栈跟踪
var st=新堆栈跟踪(ex,true);
//获取顶部堆栈帧
var frame=st.GetFrame(0);
//从堆栈帧中获取行号
var line=frame.GetFileLineNumber();
}

这段代码是如何编译的?不是吗?我只是编了一个例子来说明可能的重复为什么会得到第一个堆栈帧?您不想对最后一个堆栈帧感兴趣吗?i、 e.StackFrame=st.GetFrame(st.FrameCount-1)我尝试在WCF web服务中使用它,它返回的行号总是0。这是在调试模式下,存在.pdb文件。我在获取要由DLL加载的pdb文件时遇到问题-我是否只需要确保它们位于同一目录中?如果是web项目,并且您希望将pdb部署到服务器-在包/发布web部分的项目选项中取消选中“排除生成的调试符号”.有人能解释一下“用调试符号编译”吗?我的项目有“Define DEBUG constant”、“Define TRACE constant”和“DEBUG info:full”,我没有得到行号。MSDN说,“单击属性页左窗格中的“构建”选项卡,然后选中要启用的编译器设置的复选框。清除要禁用的设置的复选框。”这很有帮助。只有在取消选中“优化代码”时,我才能使其在发布模式下工作
public int GetLineNumber(Exception ex)
{

    const string lineSearch = ":line ";
    var index = ex.StackTrace.LastIndexOf(lineSearch);
    int ln=0;
    if (index != -1)
    {


        var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
        string lnum = System.Text.RegularExpressions.Regex.Match(lineNumberText, @"\d+").Value;
        int.TryParse(lnum,out ln);

    }
    return ln;
}