2010-09-14 80 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

相关问题