说我有这样的方法:
public void SaveData()
{
try
{
foreach (var somevar1 in list.SomeType1s)
{
CEData.SaveRow(sometype1)
}
foreach (var somevar2 in list.SomeType2s)
{
CEData.SaveRow(sometype2)
}
foreach (var somevar3 in list.SomeType3s)
{
CEData.SaveRow(sometype3)
}
foreach (var somevar4 in list.SomeType4s)
{
CEData.SaveRow(sometype4)
}
foreach (var somevar5 in list.SomeType5s)
{
CEData.SaveRow(sometype5)
}
}
catch (Exception e)
{
logger.DebugException("Rollback Occured with the following stack trace: \r\n"
+ e.StackTrace, e);
Rollback();
throw;
}
}
有没有办法知道捕获部分我得到了什么?我的堆栈跟踪只会说它在方法SaveData()中,但不是哪一行失败。
我可以在每行之间添加日志记录,但我不愿意(因为各种调试代码的原因)。
所以,我想我会问。是否有可能知道抛出异常时正在执行哪一行?
更多信息:
看起来行号应该是标准的。我可以看到我没有得到它们的唯一原因是我正在进行Windows Mobile和Compact Framework开发。那么也许它们不包含在紧凑的框架中? (我的项目为调试信息输出设置了“完整”。)
答案 0 :(得分:6)
使用System.Diagnostics
中的StackFrame
类来考虑此代码段:
using System.Diagnostics;
....
catch (Exception ex) {
StackTrace st = new StackTrace(new StackFrame(true));
StackFrame sf = st.GetFrame(0);
Console.WriteLine(" File: {0}", sf.GetFileName());
Console.WriteLine(" Method: {0}", sf.GetMethod().Name);
Console.WriteLine(" Line Number: {0}", sf.GetFileLineNumber());
Console.WriteLine(" Column Number: {0}", sf.GetFileColumnNumber());
}
对于特定于Compact Framework,生成的错误.ToString()
是否包含行号?也许是这样的事情:
catch(Exception ex)
{string errDesc = ex.ToString();}
揭示:
在D:\ sourcecode \ somefile.cs中的MyProf.Class.MyMethod(int foo)中的“System.Exception:foo \ r \ n”:第1234行“
答案 1 :(得分:2)
当您捕获Exception时,请使用Exception.ToString()方法。如果在与exe / dll相同的目录中有匹配的.pdb文件(可以通过选择调试版本配置来完成),那么输出将自动包含行号。
答案 2 :(得分:1)
不,Compact Framework没有提供该信息。将SaveData重构为每个for循环的私有方法,然后你至少要缩小它(通过方法名或输入参数)。