2010-08-17 45 views
3

说我有这样的方法:有没有办法找出引发异常的行?

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

这是一个问题w /运行在发布vs调试,或没有符号存在?堆栈跟踪对于我来说通常都有线路,对于堆栈的每一帧。另外,您是否能够在重新解决此问题时附加调试器?如果是这样,并且您正在使用MSVC,只需调出调用堆栈窗口,然后双击一个更高的堆栈帧... – 2010-08-17 22:44:54

+0

如果您的PDB未部署到映像中,那也可能是问题。至少,我认识一个正在从事基于CF的产品的人。 – 2010-08-17 22:53:49

+0

我试图追踪的错误在Visual Studio中不会发生,但是我嘲笑它并且没有获得行号。我打开了全面的调试,所以我只能假设这是Compact Framework的限制。 – Vaccano 2010-08-17 22:55:39

回答

1

不,Compact Framework不提供该信息。将SaveData重构为每个for循环的私有方法,然后至少缩小它(通过方法名称或输入参数)。

6

使用System.DiagnosticsStackFrame类考虑这个片段:

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();} 

借鉴:

“的System.Exception:FOO \ r \ n在MyProf.Class.MyMethod(INT FOO)在d:\源代码\ somefile.cs:行1234“

+0

我不认为这很重要,所以我没有用紧凑框架标记这个问题(最初),但我的项目是一个紧凑的框架项目,并且紧凑框架上不支持StackTrace和StackFrame类。 :( – Vaccano 2010-08-17 22:57:03

+0

@Vaccano:确实,很抱歉听说StackTrace不在Compact Framework中。另外:当你捕获异常并检查'ex.ToString()'时,它是否包含最后的行号“。 ..线:123“? – 2010-08-17 23:02:22

+0

唉,我已经做了一些挖掘,看起来行号不支持紧凑框架。不知道谁的想法是。 :( – Vaccano 2010-08-17 23:03:26

2

当您捕获异常时,请使用Exception.ToString()方法。如果您在exe/dll所在的目录中具有匹配的.pdb文件(您可以通过选择调试版本配置来执行此操作),则输出将自动包含行号。

相关问题