2010-08-17 44 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文件(您可以通過選擇調試版本配置來執行此操作),則輸出將自動包含行號。

相關問題