C# 确定引发异常的代码行
在dotNet中,一行抛出异常并被捕获,我如何确定哪一行在哪个文件中抛出异常?看起来比较简单,但我想不出来…只有在有调试符号可用的情况下,才能这样做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
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);
...
}