有没有办法找出抛出异常的行?

时间:2010-08-17 22:39:38

标签: c# exception exception-handling compact-framework

说我有这样的方法:

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开发。那么也许它们不包含在紧凑的框架中? (我的项目为调试信息输出设置了“完整”。)

3 个答案:

答案 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循环的私有方法,然后你至少要缩小它(通过方法名或输入参数)。