答案 0 :(得分:238)
答案 1 :(得分:51)
答案 2 :(得分: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;
}
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;
}
}
答案 3 :(得分:17)
答案 4 :(得分:7)
有效:
var LineNumber = new StackTrace(ex, True).GetFrame(0).GetFileLineNumber();
答案 5 :(得分:2)
检查一下
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();
答案 6 :(得分:2)
我在Exception上添加了扩展名,该扩展名返回行,列,方法,文件名和消息:
public static class Extensions
{
public static string ExceptionInfo(this Exception exception)
{
StackFrame stackFrame = (new StackTrace(exception, true)).GetFrame(0);
return string.Format("At line {0} column {1} in {2}: {3} {4}{3}{5} ",
stackFrame.GetFileLineNumber(), stackFrame.GetFileColumnNumber(),
stackFrame.GetMethod(), Environment.NewLine, stackFrame.GetFileName(),
exception.Message);
}
}
答案 7 :(得分:1)
我尝试使用@ 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)
更新回答
// 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)
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 :(得分:0)
为我工作:
python:2.7-windowsservercore-1809
答案 11 :(得分:0)
如果使用调试符号编译生成异常的库,行号将包含在堆栈跟踪中。这可以是单独的文件 (*.pdb) 或嵌入到库中。
对于 .NET Core、.NET 5 及更高版本,要在发布版本中具有完整的异常行号,请按如下方式配置项目:
<PropertyGroup>
<DebugSymbols>true</DebugSymbols>
<DebugType>embedded</DebugType>
<!-- Only enable the following if the line numbers mismatch -->
<!--<Optimize>false</Optimize>-->
<!--
Additional properties which may impact how printed line numbers match the source code line numbers are listed here:
https://docs.microsoft.com/en-us/dotnet/core/run-time-config/compilation
-->
</PropertyGroup>
上述配置将直接在构建文件中包含调试符号,可以将其发布为 nuget。
上述替代方法是将调试包与主要 nuget 包一起恢复,目前尚不支持:https://github.com/NuGet/Home/issues/9667
现在获取异常行号:
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();
}
答案 12 :(得分:-3)
答案 13 :(得分:-19)
这对我有用:
try
{
//your code;
}
catch(Exception ex)
{
MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message);
}