答案 0 :(得分:14)
如果需要文件和行号,则无需解析StackTrace字符串。您可以使用System.Diagnostics.StackTrace从异常创建堆栈跟踪,这样您就可以枚举堆栈帧并获取引发异常的文件名,行号和列。这是一个如何执行此操作的快速而肮脏的示例。不包括错误检查。为此,PDB需要与调试符号一起存在,默认情况下使用调试版本创建。
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
TestFunction();
}
catch (Exception ex)
{
StackTrace st = new StackTrace(ex, true);
StackFrame[] frames = st.GetFrames();
// Iterate over the frames extracting the information you need
foreach (StackFrame frame in frames)
{
Console.WriteLine("{0}:{1}({2},{3})", frame.GetFileName(), frame.GetMethod().Name, frame.GetFileLineNumber(), frame.GetFileColumnNumber());
}
}
Console.ReadKey();
}
static void TestFunction()
{
throw new InvalidOperationException();
}
}
}
上面代码的输出如下所示
D:\Source\NGTests\ConsoleApplication1\Program.cs:TestFunction(30,7) D:\Source\NGTests\ConsoleApplication1\Program.cs:Main(11,9)
答案 1 :(得分:10)
您可以使用try / catch围绕可以抛出的代码打印整个堆栈跟踪,然后使用Console.WriteLine来显示异常对象:
try
{
new Program().Run();
}
catch (Exception exception) // Prefer to catch a more specific execption.
{
Console.WriteLine(exception);
}
输出:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Program.Run() in C:\Console Application1\Program.cs:line 37
at Program.Main(String[] args) in C:\Console Application1\Program.cs:line 45
第一行显示异常的类型和消息。第二行显示抛出异常的文件,函数和行号。您还可以在以下行中查看调用堆栈上其他调用的位置。
您还可以获取未捕获的异常的文件和行号。您可以通过在当前AppDomain上为AppDomain.UncaughtException事件添加处理程序来执行此操作:
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
new Program().Run();
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine(e.ExceptionObject);
}
这显示了与上面类似的输出。
答案 2 :(得分:5)
Console.WriteLine(exception.StackTrace);
确保您的应用程序处于Debug
模式或包含调试符号(.mdb文件),以便显示行号。
答案 3 :(得分:2)
您可以通过访问Exception.StackTrace
来获取堆栈跟踪,这是一个字符串,因此您可以使用Write
或WriteLine
方法将其打印到控制台。
答案 4 :(得分:0)
您可以在最后一行的堆栈跟踪(Exception.StackTrace property
)中找到它,但只有在编译了包含调试信息的代码时才能找到它。否则,行号将是未知的。