C# 确定引发异常的代码行

C# 确定引发异常的代码行,c#,exception,stack,stack-frame,C#,Exception,Stack,Stack Frame,在dotNet中,一行抛出异常并被捕获,我如何确定哪一行在哪个文件中抛出异常?看起来比较简单,但我想不出来…只有在有调试符号可用的情况下,才能这样做 catch(Exception ex) { // check the ex.StackTrace property } 如果您想在VS中调试这种情况,最好在debug菜单中的Exceptions对话框中选中抛出的公共语言运行时异常的复选框。抛出异常后,调试器将立即中断,即使它位于try块中。您可以使用: 在.NET中,你有一个叫做Firs

在dotNet中,一行抛出异常并被捕获,我如何确定哪一行在哪个文件中抛出异常?看起来比较简单,但我想不出来…

只有在有调试符号可用的情况下,才能这样做

catch(Exception ex) {
    // check the ex.StackTrace property
}
如果您想在VS中调试这种情况,最好在
debug
菜单中的
Exceptions
对话框中选中
抛出的
公共语言运行时异常的复选框。抛出异常后,调试器将立即中断,即使它位于
try
块中。

您可以使用:


在.NET中,你有一个叫做FirstChanceException的异常。这些基本上是在处理异常之前抛出的。有两种方式来看待你在这里提出的问题。一个是从调试的角度。如果进行调试,您可以将调试器设置为从“调试/异常”窗口捕获抛出的异常。这在交互式上下文中更容易实现。如果您需要在非交互式上下文中记录这些信息,那么我会做一些类似于CMS所说的事情

try
{
    ...
}
catch(Exception ex)
{
    System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(ex);
    System.Diagnostics.StackFrame firstFrame = stackTrace.GetFrame[0];
    Console.WriteLine(firstFrame.GetFileLineNumber);
    ...
}

这里唯一的区别是,我们获取整个堆栈跟踪,然后转到第一帧,这是异常最初抛出的地方。

我个人只记录异常的ToString()返回值。包括整个堆栈跟踪。这是一行代码。。。非常简单。

但是请注意,这将返回“catch”子句的信息。。。不是抛出异常的地方,因此您需要检查捕获的异常的“StackTrace”属性的内容!由于jerryjvl所说的原因,这个答案是错误的。这怎么能被认为是正确的呢?第0帧不是当前帧的方法吗,不是错误产生的地方吗?
try
{
    ...
}
catch(Exception ex)
{
    System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(ex);
    System.Diagnostics.StackFrame firstFrame = stackTrace.GetFrame[0];
    Console.WriteLine(firstFrame.GetFileLineNumber);
    ...
}