如何检查线程代码是不是在 try-catch 块中运行
Posted
技术标签:
【中文标题】如何检查线程代码是不是在 try-catch 块中运行【英文标题】:How to check if Thread code runs in try-catch block如何检查线程代码是否在 try-catch 块中运行 【发布时间】:2010-09-14 11:42:21 【问题描述】:我想验证我们的代码并检查我们执行的每个线程是否在 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 或其他工具进行验证。类似的规则可以应用于其他一些事情,例如。计时器滴答声等...
【问题讨论】:
贵公司的开发人员使用线程池吗?不要忘记将 BeginInvoke 与 EndInvoke 匹配,并使用 try/catch 块包装 EndInvoke... 【参考方案1】:有关如何在 FxCop 规则中检测包装 try/catch 块的示例,请参阅 http://social.msdn.microsoft.com/Forums/en-US/vstscode/thread/a257a910-126e-4c8d-aab3-3199347346ec。实际上比较棘手的是检测哪些方法容易从后台线程运行,因为它们并非都使用明显的启动器(如 Thread.Start 或 ThreadPool.QueueUserWorkItem)生成。
也就是说,您可能需要重新考虑将您的方法从添加包装 try/catch 转换为使用为您添加 try/catch 的自定义线程启动器。 (然后您可以创建一个 FxCop 规则来验证正在使用自定义启动器/帮助器而不是基本框架类似物。)这将具有允许您系统地将其他更改应用于所有线程的优势(例如:设置文化、跟踪启动堆栈跟踪以用于以后的异常记录等),而无需更改从衍生线程运行的所有方法。
【讨论】:
第二段加1。【参考方案2】:我不知道你是否可以在 FXCop 中为此添加自定义规则,但你可以使用Mono.Cecil
来做到这一点,但这并不是那么简单。
【讨论】:
【参考方案3】:This 是滚动您自己的 FxCop 规则的非常好的资源。你可以通过谷歌搜索找到许多其他的。
我相信您可以开始查看 Thread 构造函数的调用者。然后在调用语句中,您可以通过查看委托参数来获取线程过程的地址。获得方法 ref 后,您需要在方法主体中检查您希望的结构的语句。
【讨论】:
【参考方案4】:这并不能直接回答您的问题,但可能是相关的。
您是否对执行上述操作感兴趣,因为您不希望您的应用程序在线程抛出未捕获的异常时退出/崩溃?如果是,那么您可以在配置部分的 app.config 文件中添加以下内容:
<runtime>
<legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>
免责声明不建议执行上述操作,但可能会在不得已的情况下使用。
警告:如果您决定使用上述方法,您的应用程序将不会报告任何错误并继续尽可能地执行。因此,您应该有一个处理程序,该处理程序至少会通过
记录任何未捕获的异常 void AppStartup()
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
//log error
【讨论】:
免责声明不够有力。只要您不记录令人讨厌的副作用,这是非常糟糕的建议。 “这是一个非常糟糕的建议,只要你不记录讨厌的副作用”我做了什么?我用斜体表示免责声明,前面的警告可能与问题无关,并用粗体表示“警告”。你还想让我做什么?以上是关于如何检查线程代码是不是在 try-catch 块中运行的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs:catch块中的回调函数在try-catch中返回未定义的参数
try-catch- finally块中, finally块唯一不执行的情况是什么?
在线程中处理在 catch 块中抛出的异常的最佳实践。 (。网)