在dotNet中,一行代码抛出异常并被捕获后,我该如何确定是哪个文件的哪一行抛出的异常?这似乎很简单,但我无法弄清楚...
只有在有调试符号的情况下才能执行此操作。
catch(Exception ex) {
// check the ex.StackTrace property
}
如果您想在VS中调试这种情况,最好只需在“Debug”菜单中的“Exceptions”对话框中勾选“Common Language Runtime Exceptions”的“Thrown”复选框即可。即使异常在try块中,调试器也会在抛出异常时立即中断。
就我个人而言,我只记录异常的ToString()返回值。整个堆栈跟踪都包括在内。这只需要一行代码...非常简单。
try
{
...
...
}
catch(...)
{
StackFrame sf = new StackFrame(true);
int lineNumber = sf.GetFileLineNumber();
int colNumber = sf.GetFileColumnNumber();
string fileName = sf.GetFileName();
string methodName = sf.GetMethod().Name;
}
try
{
...
}
catch(Exception ex)
{
System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(ex);
System.Diagnostics.StackFrame firstFrame = stackTrace.GetFrame[0];
Console.WriteLine(firstFrame.GetFileLineNumber);
...
}