2010-09-14 88 views
3

我想驗證我們的代碼並檢查我們執行的每個線程是否都在try catch塊中運行。如何檢查線程代碼是否在try-catch塊中運行

有效樣本:

Thread loadDataThread = new Thread(new ThreadStart(LoadData)); 
public void LoadData() 
{ 
    try {/*do something*/} 
    catch(Exception ex) { /*Handle exception*/ } 
} 

不有效樣本:

Thread loadDataThread = new Thread(new ThreadStart(LoadData)); 
public void LoadData() 
{ 
    /* do something */ 
} 

這是東西,可以用的FxCop或其他工具進行驗證。類似的規則可以應用於其他一些事情,例如。定時器蜱等...

+0

在您的公司使用ThreadPool做開發嗎?不要忘記將EndInvoke與BeginInvoke匹配,並用try/catch塊封裝EndInvoke ... – Dave 2010-09-14 12:40:08

回答

0

我不知道您是否可以在FXCop中爲此添加自定義規則,但您可以使用Mono.Cecil來做到這一點,但事情並非如此簡單。

0

This是一個很好的資源來滾動你自己的FxCop規則。您可能會發現許多其他搜索結果。

我相信你可以開始看線程構造函數的調用者。然後在調用語句中,可以通過查看委託參數來獲取線程過程的地址。一旦獲得方法ref,您需要在方法體內檢查您希望的結構的語句。

0

這不直接回答你的問題,但可能是相關的。

您是否對上述操作感興趣?因爲您不希望您的應用程序在線程拋出未捕獲的異常時退出/崩潰?如果是的話,那麼你可以添加以下配置節您的app.config文件:

<runtime> 
<legacyUnhandledExceptionPolicy enabled="1"/> 
</runtime> 

免責聲明做上述不推薦,但可以在萬不得已的情況下使用。

警告:如果您決定使用上述應用程序,則不會報告任何錯誤並繼續儘可能地執行。因此,你應該有至少會通過

void AppStartup() 
    { 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
    } 

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     //log error    
    } 
+0

免責聲明不夠強。只要你沒有記錄令人討厭的副作用,這是非常糟糕的建議。 – 2010-09-14 13:14:23

+0

「這是非常糟糕的建議,只要你沒有記錄我所做的討厭的副作用」 ?我以斜體表示免責聲明,在前面發出警告,可能與該問題無關,並且以粗體顯示「警告」。你還想讓我做什麼? – wal 2010-09-14 13:17:51

1

記錄任何未捕獲的異常見http://social.msdn.microsoft.com/Forums/en-US/vstscode/thread/a257a910-126e-4c8d-aab3-3199347346ec對於如何在FxCop的規則檢測包裝try/catch塊的例子的處理程序。實際上有一點棘手的是檢測哪些方法容易從後臺線程運行,因爲它們並不都是使用Thread.Start或ThreadPool.QueueUserWorkItem等明顯的啓動程序生成的。這就是說,你可能想重新考慮從添加包裝嘗試/捕獲到使用爲你添加try/catch的自定義線程啓動器切換你的方法。 (然後,您可以創建一個FxCop規則來驗證自定義啓動器/助手是否正在使用,而不是使用基本框架類比。)這將有利於您對所有線程進行系統應用其他更改(例如:設置文化,跟蹤啓動堆棧跟蹤以用於稍後的異常日誌記錄等)而無需更改從衍生線程運行的所有方法。

+0

加1爲第二段。 – 2010-09-16 20:13:33

相關問題