2017-04-26 56 views
0

當我想調試我的應用程序拋出異常,這意味着我需要禁用try-catch塊這樣的:更好的方式嘗試趕上只在釋放?

#if !DEBUG 
       try 
       { 
#endif 
        // Do something 
#if !DEBUG 
       } 
       catch (ArgumentException) 
       { 
        Console.WriteLine("Something wrong"); 
       } 
#endif 

注:我知道在Visual Studio中的處理異常突破,但不足之處它是否在同一類型的每個異常中都被打破。 編輯來更改我的意思:例如,函數A和B都拋出NullReferenceException,但我只想檢查A什麼時候拋出它,但不是B(處理N中的NulRefExc已經是正確的)。

有人可能會問爲什麼我需要這個。通常我在沒有調試的情況下運行ASP.NET MVC代碼(但仍然在調試版本中,它有DEBUG變量),並且拋出異常真的很棒,而不是捕獲它(當然僅在開發模式下),因爲帶有堆棧跟蹤的錯誤頁面將會顯示,所以我們可以更快地跟蹤錯誤。

有沒有更清晰的方法來編寫代碼?

+0

我不看怎麼做這個(想象有一個方式)將使您免於「不利之處在於,它在每種相同類型的異常情況下都會中斷,無論它發生在何處」 – user5328504

+1

您是否需要捕獲全局異常?並且在它上面創建斷點,您將在調試器中獲得堆棧跟蹤的完整異常。 – nyconing

+0

Google [asp.net mvc global error handler](https://www.google.ca/search?q=asp+mvc+global+error+handler&oq=asp+mvc+global+e&aqs=chrome.1.69i57j0l5.7663j0j4&sourceid=chrome&ie = UTF-8) – CodingYoshi

回答

2

只是一個想法 離開嘗試捕捉

然後做

catch (ArgumentException) 
       { 
#if DEBUG 
       throw SomeCustomExceptionYouCatchWith_break_on_handled_exception(); 
#endif 
        Console.WriteLine("Something wrong"); 
       } 
+2

你甚至可能有自定義異常獲取作爲構造參數的原始異常 – user5328504

+0

哇,這很好!正是我需要的!如果只是一個簡單的調試代碼,'#if'指令之間的'throw;'語句就足夠了:) –

+0

@DatVM在生產過程中不寫入「控制檯」,而是寫入日誌。 [控制檯寫入在asp中去哪裏](http://stackoverflow.com/questions/137660/where-does-console-writeline-go-in-asp-net) – CodingYoshi

1

兩件事情:

  1. 多少地方,你要去把#if DEBUG
  2. Console.WriteLine在ASP.NET中沒有意義。有關更多信息,請參閱this

你應該做的是將錯誤記錄到數據庫,文件或其他東西。這將避免代碼中的所有#if DEBUG。有關日誌記錄的更多信息,請參閱this

這有額外的好處:

  1. 你將能夠看到你的錯誤是什麼樣子,所以當你進入生產階段你會得到相同的信息。如果您沒有足夠的信息,在日誌中,開發過程中,您可以更改錯誤消息並確保堆棧跟蹤在那裏。當你投入生產時這會很有幫助,因爲現在你有更好的錯誤。
  2. 你的代碼是清潔
+1

我認爲你應該在將來的某個地方遵循此建議。您目前的方法會變得很難看 – user5328504

+0

@ user5328504抱歉,您的意思是? – CodingYoshi

+0

我的意思是你應該(在將來)制定一個更好的日誌記錄機制。現在不要擔心,下次告訴你如何處理跟蹤和日誌記錄。現在不要放鬆你的睡眠,雖然 – user5328504

3

由於C#6你也可以使用exception filters爲:

try 
{ 
    // Do something 
} 
catch (ArgumentException) when (!Env.Debugging) 
{ 
    // Handle the exception 
} 

Env.Debugging某處定義爲

public static class Env 
{ 
#if DEBUG 
    public static readonly bool Debugging = true; 
#else 
    public static readonly bool Debugging = false; 
#endif 
} 

作爲一個額外的獎金,你會當未捕獲異常對象時,獲取原始調用堆棧(由於when測試失敗,即在調試中)。在重新拋出異常的情況下,您將不得不提供最初的異常作爲內部異常,並且需要做出一些額外的努力來處理它。

此方法還可以根據其他條件來啓用/禁用異常處理,一個web.config設置,例如,這將允許您無需重新編譯swicth:

public static class Env 
{ 
    public static readonly bool Debugging = 
     Convert.ToBoolean(WebConfigurationManager.AppSettings["Debugging"]); 
} 
+0

酷!我從來沒有想過這個。現在這個問題有2個很好的答案,我不知道標記哪個。 P.s:'public const bool'是一個較短的版本。 –