我有一个未经治疗的例外处理程序。它显示了一个不错的GUI,并允许用户发送错误报告。用户甚至可以留下他们的姓名,电话号码和东西,我们的支持部门给他们回电。效果很好,看起来不错,使客户不太生气。从理论上讲,无论如何。

问题在于我的应用程序使用背景线程,并且线程似乎不在乎是否抛出了例外,例如GUI线程(这很有意义),然后继续进行工作。如果用户允许我的自定义异常处理程序保持足够长的时间,则最终会导致弹出一个WER对话框,使其看起来像错误处理程序本身崩溃了。

我无法访问异常处理程序范围中的线程对象,因此我无法暂停它们。使线程对象在全球范围内访问也不是解决方案。我现在的解决方法是使用类似 Globals.Crashed = true; 在我的例外处理程序中,请让我的线程方法检查每个循环迭代中的属性。并不完美,但可以最大程度地减少伤害。

有人知道一种不太黑的方法吗?我的方法错了吗?我是否必须像WER一样进行此操作,并启动一个暂停主程序并显示错误UI的外部程序?

有帮助吗?

解决方案

如果您有一个未知的,未知的例外,则可以假设任何事情都发生了,并且您的程序甚至可能无法做最简单的事情。考虑到它已经消耗了所有可用内存的情况 - 那么您也将无法发送错误报告,因为它可能需要分配内存。

一个好方法是写一个 分离 仅执行错误报告的小型应用程序。该应用程序可以从文件中获取详细信息。这样,您未知的异常处理程序就会:

  • 将信息转移到临时目录中的文件中。
  • 以文件名作为参数启动错误报告应用程序。
  • 终止失败的过程,然后才能做些愚蠢的事情。

临时文件应通过错误报告应用程序删除。

其他提示

您可以在全局集合对象中跟踪所有线程,以便当您的处理程序执行时,它可以简单地遍历收集对象并中止此处的线程。

看这个问题中的代码, 在C#中暂停过程, ,您需要对其进行调整,以免暂停您的GUI线程,而不是您启动的任何背景线程,但它应该可以解决问题。

但是,更好的选择是尝试启动您的错误报告GUI作为一个单独的过程,将任何必需的信息传递给它,然后从您的未经手的异常处理程序中杀死原始过程,而不是让任何事情都以潜在损坏的状态运行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top