2017-02-28 23 views
0

每當我將Action作爲內聯聲明的參數傳遞時,在引發異常時不會得到正確的行號。例如,如果我宣佈這個功能:獲取來自參數化動作的異常行號

public static void Do(Action action) 
{ 
    //do some things 
    action(); 
    //do some things 
} 

然後調用它像這樣:

Helper.Do(() => { 
    int x = 1; 
    x++; 
    x = x/0; 
    x--; 
}); 

返回將引用線Helper.Do(() => {除外,它並沒有告訴我哪行拋出的實際錯誤。有沒有辦法在仍使用此模式的情況下檢索正確的行號?

+0

是'Helper.Do'一個'嘗試catch'裏面? – JohanP

+0

我可以把它放在'try catch'中,甚至讓整個應用程序崩潰,在這兩種情況下,異常中的堆棧跟蹤都會指向'Helper.Do'行號。 –

回答

1

我測試了您的代碼,並得到Exception發生的確切行號。這是我的測試代碼:堆棧跟蹤的

static void Main(string[] args) 
    { 
     try 
     { 
      Helper.Do(() => { 
       int x = 1; 
       x++; 
       x = x/0; 
       x--; 
      }); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      throw; 
     } 
} 

e.Message = "Attempted divide by zero"

e.StackTrace = at ConsoleApplication1.Program.<>c.<Main>b__1_0() in C:\test\ConsoleApplication1\ConsoleApplication1\Program.cs:line 46 at ConsoleApplication1.Helper.Do(Action action) in C:\test\test\ConsoleApplication1\ConsoleApplication1\Helper.cs:line 14 at ConsoleApplication1.Program.Main(String[] args) in C:\test\test\ConsoleApplication1\ConsoleApplication1\Program.cs:line 43

線46 x = x/0;

+0

好的,你明白了。我發現我正在做的是從'Do'方法內部重新推出,這似乎引起了我所看到的行爲。謝謝 –