如何检查线程代码是不是在 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 块中抛出的异常的最佳实践。 (。网)

如何在cfcatch块中检查本机代码错误?

java 在try-catch块中使用if语句不适用于JSoup

当服务器在 try-catch 块中发送 422 时,axios 无法捕获错误